在 Linux 网络编程中,backlog 满通常指 TCP 监听 socket 的 accept 队列(全连接队列)或 syn 队列(半连接队列)满了,导致新的连接无法被正常建立。下面从原理到常见原因系统说明。
以 listen(fd, backlog) 为例:
backlog 主要限制 全连接队列(accept queue)/proc/sys/net/ipv4/tcp_max_syn_backlog 控制两个关键队列:
accept()backlog 满,通常是 accept 队列满
客户端完成三次握手
→ 进入 accept 队列
→ 但应用没及时 accept()
→ 队列堆积
→ 满了
典型场景:
accept✅ 表现:
ss -lnt 中 Recv-Q 接近 Send-Qnetstat 大量 ESTABLISHED 但未被 acceptlisten(fd, 5);
高并发下:
✅ 生产建议:
listen(fd, 1024);
并结合内核参数:
net.core.somaxconn = 4096
例如:
即使 accept 正常,也可能瞬时打满。
ESTABLISHED常见于:
大量伪造 SYN
→ SYN 队列满
→ 无法进入三次握手
表现:
SYN_RECV 很多相关参数:
tcp_max_syn_backlog
tcp_syncookies = 1
即使队列没满:
accept() 返回 EMFILEss -lnt
示例:
State Recv-Q Send-Q Local Address
LISTEN 1024 1024 :8080
Recv-Q ≈ Send-Q → accept 队列满netstat -an | grep :8080 | awk '{print $6}' | sort | uniq -c
关注:
ESTABLISHED 很多但未处理SYN_RECV 很多netstat -s | grep -i listen
例如:
times the listen queue of a socket overflowed
backlogaccept,业务逻辑异步处理net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_syncookies = 1
Linux backlog 满,本质是“连接到来速度 > 应用消费速度”
要么是程序慢,要么是队列小,要么是流量异常。
如果你愿意,可以贴:
ss -lnt我可以帮你精准定位是哪一种原因。