在 Linux 网络编程和系统中,“backlog 溢出”通常指 TCP 监听队列(accept queue)满,导致新连接被丢弃或重传,表现为连接失败、延迟高、SYN 被丢等。下面按「定位 → 原因 → 解决」来说明。
netstat -s | grep -i listen
或
cat /proc/net/netstat | grep ListenOverflows
重点关注:
ListenOverflows:监听队列溢出次数ListenDrops:监听被丢弃次数如果这两个值持续增长,就是 backlog 溢出。
ss -lnt
示例:
State Recv-Q Send-Q Local Address:Port
LISTEN 129 128 :::8080
Recv-Q:当前已完成握手的连接数Send-Q:backlog 上限(min(应用 backlog, somaxconn))如果 Recv-Q == Send-Q,说明队列已满。
实际 backlog 上限是:
min(应用 listen(backlog), net.core.somaxconn)
listen(fd, 128)(很多框架默认)net.core.somaxconn = 128所以 即使你设了 1024,也可能被 128 限制。
sysctl -w net.core.somaxconn=65535
持久化:
echo "net.core.somaxconn=65535" >> /etc/sysctl.conf
sysctl -p
listen 8080 backlog=65535;
serverSock.bind(new InetSocketAddress(port), 65535);
net.ListenConfig{Backlog: 65535}
server.listen(port, () => {}, 65535);
⚠️ 必须 应用 + 内核同时调大 才有效。
如果 SYN 很多:
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
sysctl -w net.ipv4.tcp_syncookies=1
注意:SYN Cookie 开启后,半连接队列基本无限,但不保证 TCP 选项性能最优。
backlog 溢出通常不是“太小”,而是:
优化方向:
如果是攻击:
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_syncookies=1
应用 listen backlog ≥ 65535
❌ 只改应用 backlog
❌ 只看 netstat -an,不看 ListenOverflows
❌ 把 SYN 队列和 accept 队列混为一谈
如果你能告诉我:
ss -lnt 和 netstat -s 输出我可以给你更精确的调优方案。