在 Linux 网络编程和系统内核中,**backlog(积压队列)**通常指的是 TCP 监听套接字(listen socket)上用于暂存连接请求的队列。它不是一个单一的队列,而通常包含两个逻辑队列(根据内核版本和实现有所不同)。
在服务器端使用 TCP 时,典型流程是:
socket()
bind()
listen(sockfd, backlog)
accept()
其中 listen() 的第二个参数 backlog 就是“积压队列长度”。
SYN_RCVD/proc/sys/net/ipv4/tcp_max_syn_backlog
ESTABLISHEDlisten(fd, backlog) 主要限制的是这个队列✅ backlog 实际限制的是“全连接队列”长度(Linux 2.2+)
在 Linux 中:
listen(sockfd, backlog)
实际队列长度是:
min(backlog, /proc/sys/net/core/somaxconn)
somaxconn 默认通常是 128listen(fd, 1024),也可能被截断为 128查看:
cat /proc/sys/net/core/somaxconn
修改:
sysctl -w net.core.somaxconn=1024
客户端 SYN
↓
[半连接队列]
↓ 三次握手完成
[全连接队列]
↓ accept()
应用程序
如果:
connection refused 或超时| 场景 | 建议 |
|---|---|
| 普通 Web 服务 | 128–512 |
| 高并发短连接 | 1024+ |
| 容器 / 微服务 | 配合 somaxconn |
| 突发流量 | 增大 backlog |
⚠️ 注意:
accept() 处理慢的问题❌ backlog 是“最大连接数”
✅ 不是,是“待 accept 的连接数”
❌ backlog 包含半连接
✅ 主要是全连接(历史实现有差异)
❌ 改了 listen 就够
✅ 还要改 somaxconn
如果你愿意,我也可以:
你现在是在学网络编程,还是排查性能问题?