在 Linux 系统中,backlog 通常出现在 网络编程 和 内核参数 的上下文中,最常见的是与 TCP 连接队列 相关。它的核心作用是:控制内核在应用层尚未调用 accept() 之前,允许暂存的连接请求数量。
下面分几个层次说明它的作用。
在调用 listen(fd, backlog) 时:
int listen(int sockfd, int backlog);
backlog 表示:该 socket 能同时容纳的“半连接 + 全连接”数量的建议值。
注意:backlog 不是硬性上限,而是给内核的“建议值”。
Linux 内核中,TCP 连接的建立过程涉及两个队列:
SYN_RECV/proc/sys/net/ipv4/tcp_max_syn_backlog 影响accept() 的连接ESTABLISHED| 场景 | 结果 |
|---|---|
| backlog 太小 | 连接队列容易满,新连接可能被丢弃或重传 |
| backlog 太大 | 占用更多内核资源 |
| 高并发服务 | 需要适当增大 backlog |
当全连接队列满时:
connection timeoutconnection resetmin(backlog, somaxconn)cat /proc/sys/net/core/somaxconn
默认通常是:
128
所以即使你写:
listen(fd, 1024);
实际生效的可能仍然是 128,除非你修改 somaxconn。
| 参数 | 作用 |
|---|---|
net.core.somaxconn |
全连接队列最大长度 |
net.ipv4.tcp_max_syn_backlog |
半连接队列最大长度 |
net.ipv4.tcp_syncookies |
SYN 溢出时是否启用 cookie 防护 |
常见调优示例:
sysctl -w net.core.somaxconn=2048
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
并在应用中:
listen(fd, 2048);
netstat -s | grep -i listen
或:
ss -lnt
看到 Recv-Q 接近 backlog,说明队列压力大。
❌ backlog 不是最大并发连接数
✅ 它只是 等待 accept 的连接数
❌ backlog 越大越好
✅ 过大会浪费内核资源
Linux backlog 的作用是:限制 TCP 全连接队列的大小,控制内核在应用处理之前可以暂存多少个已完成三次握手的连接,从而影响高并发场景下的连接成功率。
如果你愿意,我可以:
只要告诉我你的使用场景即可。