在 Linux 中,backlog 满通常指的是 TCP 监听队列(listen backlog)已满,导致新的连接无法立即被内核接受。下面从原理、常见原因和排查方法三个层面说明。
在 TCP 服务器中,一般流程是:
socket()
bind()
listen(fd, backlog)
accept()
listen(fd, backlog) 中的 backlog 表示:
已完成三次握手、但尚未被应用层 accept() 取走的连接队列长度上限
在 Linux 中,这个队列实际上由两个队列组成:
accept()backlog 主要影响的是全连接队列大小(受内核参数限制)。
如果服务器:
accept() 不及时那么:
客户端完成三次握手
→ 连接进入 accept queue
→ 应用没 accept()
→ queue 满了
→ 新连接被丢弃或重传
✅ 表现:
accept() 调用不及时代码里写死了很小的 backlog:
listen(fd, 5);
即使系统能支持更大,也会被限制。
Linux 实际 backlog 是:
min(backlog, net.core.somaxconn)
如果:
net.core.somaxconn = 128
而应用设置 1024,实际仍只有 128。
✅ 查看:
sysctl net.core.somaxconn
大量伪造 SYN 请求:
✅ 特点:
例如:
即使处理正常,也可能短时间 backlog 满。
netstat -s | grep -i "listen queue"
常见输出:
XX times the listen queue of a socket overflowed
✅ 说明 backlog 满了。
ss -lnt
示例:
Recv-Q Send-Q Local Address:Port
128 128 0.0.0.0:8080
Recv-Q ≈ Send-Q → 队列满Recv-Q 持续增长 → accept 不及时cat /proc/net/sockstat
或:
netstat -s | grep "SYNs"
listen(fd, 1024);
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
永久生效:
/etc/sysctl.conf
epollsysctl -w net.ipv4.tcp_syncookies=1
Linux backlog 满,本质是:内核已完成握手的连接,等不到应用 accept() 来取。
如果你愿意,可以告诉我:
ss -lnt 或 netstat -s 的输出我可以帮你更精确定位原因。