在 Linux 网络编程和系统中,backlog 通常指 listen() 系统调用中指定的连接队列长度,或者更广义地指 内核中用于存放“已完成三次握手但尚未被应用 accept”的队列(accept 队列)。
当 backlog 满了(更准确说是 accept 队列满了),会发生以下情况:
/proc/sys/net/ipv4/tcp_syncookies = 0客户端通常会看到:
connect() 超时Connection timed outConnection reset by peer(取决于内核版本和配置)| 现象 | 说明 |
|---|---|
| 新连接连不上 | accept 队列满,应用没及时 accept |
| CPU 不高但连接失败 | 不是计算瓶颈,是队列阻塞 |
| 旧连接正常 | 已 accept 的连接不受影响 |
| 压力测试失败 | 并发连接数上不去 |
listen(fd, 5) 在高并发下明显不够现代 Linux 中:
backlog 参数 不是精确值min(backlog, somaxconn)somaxconn 默认通常是 128 或 4096查看:
cat /proc/sys/net/core/somaxconn
修改:
sysctl -w net.core.somaxconn=65535
# 查看 Listen 队列溢出
netstat -s | grep listen
# 或
ss -lnt
关注:
Recv-Q 接近 Send-QTCPBacklogDrop 增加✅ 增大 backlog
listen(fd, 1024);
✅ 增大 somaxconn
✅ 使用 多线程 / 非阻塞 + epoll
✅ 快速 accept,再丢给线程池处理
✅ 开启 syncookies(防 SYN 攻击)
Linux backlog 满了,新连接进不来,客户端表现为连接超时或失败,但已建立的连接不受影响。
如果你愿意,我可以结合 具体语言(C / Java / Go / Nginx) 或 内核版本 给你更精确的解释。