在 Linux 网络编程里,backlog reset(backlog 被重置 / 变成 0 或变小)通常不是“随机发生”,而是某种配置、状态或代码行为导致的。下面按常见原因 → 现象 → 解决思路来说明。
listen(fd, backlog);
backlog:已完成连接(ESTABLISHED)等待 accept 的上限min(backlog, /proc/sys/net/core/somaxconn)⚠️ 注意:
最常见原因。
现象:
SO_REUSEADDR)结果:
listen(fd, backlog) 重新生效✅ 检查:
# 看进程是否重启
ps -o pid,etime,cmd -p <pid>
# 看 listen 参数
ss -lntp
cat /proc/sys/net/core/somaxconn
默认通常是 128 或 4096
如果你代码写:
listen(fd, 100000);
实际仍是 somaxconn
如果系统调小了 somaxconn:
sysctl -w net.core.somaxconn=128
看起来像 backlog 被 reset
✅ 解决:
sysctl -w net.core.somaxconn=65535
不是 backlog 变 0,而是:
现象:
ss -lnt 中 Recv-Q 接近 Send-Q✅ 检查:
ss -lnt
State Recv-Q Send-Q Local Address:Port
LISTEN 128 128 *:8080
容器里:
现象:
✅ 解决:
sysctllisten(fd, 0);
不同内核行为:
✅ 不要写 0
有人把:
net.ipv4.tcp_max_syn_backlog
当成 listen backlog
二者不同:
| 队列 | 含义 |
|---|---|
| syn backlog | SYN_RECV |
| listen backlog | ESTABLISHED 等待 accept |
# 当前 listen 状态
ss -lnt
# 内核参数
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog
# 连接状态分布
ss -tan | awk '{print $1}' | sort | uniq -c
Linux backlog 不会自动 reset,所谓 reset 几乎都是:程序重启 / listen 参数变化 / somaxconn 限制 / 队列满误解
如果你能贴:
ss -lnt 输出我可以直接帮你定位是哪一种。