在 Linux 系统中,backlog 高(一般指连接队列、请求队列积压)通常出现在网络、I/O 或应用服务场景中。下面从常见含义、原因、排查方法三个层面系统说明。
在 Linux 中,“backlog”通常指的是等待处理的请求队列长度,常见场景有:
TCP 监听队列 backlog
listen(fd, backlog)应用层队列
内核队列 / 子系统队列
connect timeoutSYN 丢包accept() 不及时| 原因 | 说明 |
|---|---|
应用 accept() 慢 |
业务线程阻塞或不足 |
| backlog 设置太小 | listen(fd, 128) |
| 半连接攻击 | SYN Flood |
| CPU 打满 | 无法及时处理 |
| 应用重启 / hang 住 | accept 没人调用 |
ss -lnt
看 Recv-Q:
LISTEN 0 128 0.0.0.0:80
如果:
LISTEN 0 1024 0.0.0.0:80
Recv-Q 接近 backlog → 满了
✅ 解决:
netstat -ant | grep SYN_RECV | wc -l
sysctl net.ipv4.tcp_max_syn_backlog
sysctl net.ipv4.tcp_syncookies
✅ 建议:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
listen(fd, 128);
而系统允许的最大值受:
sysctl net.core.somaxconn
✅ 推荐调整:
net.core.somaxconn = 4096
查看:
ss -ant | grep TIME_WAIT | wc -l
建议:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
ss -lnt
ss -ant | awk '{print $1}' | sort | uniq -c | sort -n
top
vmstat 1
strace -p <pid> -e accept
| 现象 | 原因 |
|---|---|
| Recv-Q 高 | 应用 accept 不及时 |
| SYN_RECV 多 | 半连接队列满 / SYN Flood |
| CPU 正常但 backlog 高 | 应用阻塞 |
| 瞬时高峰后恢复 | backlog 设置太小 |
✅ 正确方向不是“降低 backlog”,而是:
Linux backlog 高,本质是“请求到达速度 > 系统处理速度”,通常是应用 accept 慢、线程不足、backlog 配置过小或网络攻击导致。
如果你能提供:
ss -lnt 输出我可以帮你精准定位是哪一类 backlog 问题。