在 Linux 网络编程里,backlog 通常指的是 listen() 系统调用中的 backlog 参数,以及内核中对应的 连接队列(accept queue / syn queue)。下面从“什么程序/场景会占用 backlog”和“如何排查”两方面说明。
int listen(int sockfd, int backlog);
net.core.somaxconn(默认常是 128 / 4096)net.ipv4.tcp_max_syn_backlog(半连接队列)注意:老教材说 backlog 包含半连接,但现代 Linux 中 半连接和全连接是分开的。
任何调用了 listen() 的服务端程序都会占用 backlog,典型包括:
只要:
client 连上 → 三次握手完成 → 程序没及时 accept()
backlog 就会被占用。
这些程序表面上在跑,但实际在占 backlog:
connect() 只是发起连接ss -lnt
关注:
Recv-Q Send-Q
Recv-Q:当前 accept 队列中 未 accept 的连接数Send-Q:该 socket 的 backlog 上限示例:
LISTEN 100 128 0.0.0.0:80
→ 已占 100,上限 128(快满了)
lsof -i :80
ps -ef | grep nginx
netstat -an | grep SYN_RECV | wc -l
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog
❌ “backlog 是客户端占的”
✅ 是 服务端 listen socket 的队列
❌ “backlog 越大越好”
✅ 太大可能掩盖程序性能问题
❌ “连接断了就立刻释放”
✅ 若程序不 accept,连接会一直占着
所有调用 listen() 的服务端程序都会占用 Linux backlog;当程序处理慢、线程少或流量突增时,backlog 会被“已连接但未被 accept”的 socket 占满。
如果你愿意,可以告诉我:
ss -lnt 的输出