Linux 系统中 backlog 过高 通常指的是 网络连接队列(backlog)积压过多,最常见于 TCP 监听队列,也可能是 Accept 队列或 SYN 队列。下面从 含义、常见原因、排查方法、优化建议 四个方面说明。
在 Linux 网络编程中,backlog 通常出现在:
listen(fd, backlog);
它影响的是 TCP 连接建立过程中的两个队列:
| 队列 | 说明 |
|---|---|
| 半连接队列(SYN Queue) | 收到 SYN,但还没完成三次握手 |
| 全连接队列(Accept Queue) | 三次握手完成,等待应用调用 accept() |
backlog 主要影响的是全连接队列长度(早期内核中也会影响半连接队列)。
✅ 表示有大量 TCP 连接已完成握手,但应用程序来不及调用 accept() 取走连接
换句话说:
应用程序处理新连接的速度 < 客户端建立连接的速度
accept() 调用不及时✅ 表现:
listenOverflows 增加listen(fd, 128);
如果并发连接很高,128 很容易被打满。
✅ 但注意:
backlog 并不是你设多少就是多少
Linux 会取:
min(backlog, net.core.somaxconn)
✅ 表现:
netstat -ant | grep SYN_RECV 很多常见参数:
net.core.somaxconn
net.ipv4.tcp_max_syn_backlog
net.core.netdev_max_backlog
默认值偏小(如 128 / 256)
netstat -s | grep listen
关注:
listen queue sizes limit reached
listen queue dropped
或:
ss -lnt
示例:
Recv-Q Send-Q Local Address:Port
128 128 0.0.0.0:8080
Recv-Q ≈ backlog → 队列满ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
关注:
ESTABLISHEDSYN_RECVTIME_WAITstrace -p <pid> -e accept
或:
top / htop
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.core.netdev_max_backlog=4096
写入配置文件:
/etc/sysctl.conf
listen(fd, 4096);
⚠️ 注意:
必须同时调大
somaxconn
sysctl -w net.ipv4.tcp_syncookies=1
Linux backlog 过高 ≠ 网络问题,通常是应用处理不过来或系统参数过小
如果你能提供:
ss -lnt 输出我可以帮你 精准判断是哪一种 backlog 问题。