在 Linux 中,“backlog” 通常出现在 TCP 监听队列 和 内核参数 两个层面。下面分情况说明如何“调大”。
在代码中通过 listen() 设置:
listen(sockfd, backlog);
backlog 是 应用期望的队列长度常见服务示例:
listen 80 backlog=1024;
tcp-backlog 1024
server.xml 中 acceptCount="1024"Linux 实际 backlog 取:
min(应用 backlog, /proc/sys/net/core/somaxconn)
cat /proc/sys/net/core/somaxconn
默认通常是 128 或 4096
sysctl -w net.core.somaxconn=65535
# /etc/sysctl.conf
net.core.somaxconn = 65535
然后执行:
sysctl -p
用于 TCP 三次握手未完成阶段。
net.ipv4.tcp_max_syn_backlog
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
永久:
# /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 65535
实际全连接队列长度:
min(somaxconn, 应用 backlog)
可通过 ss 查看是否溢出:
ss -lnt
示例输出:
LISTEN 0 128 0.0.0.0:80
查看溢出情况:
netstat -s | grep -i listen
或
nstat | grep -i ListenOverflows
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_syncookies = 1 # 防止 SYN Flood
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
❌ 只改应用 backlog 不生效
✅ 必须同时调大 somaxconn
❌ 盲目调太大
✅ 队列过大可能掩盖性能问题
如果你能告诉我:
我可以给你更精确的配置建议。