在 Linux 网络编程(尤其是 TCP 服务端)里,backlog 是一个经常被问到、也很容易被误解的参数。下面从「为什么需要它」「它控制什么」「常见误区」三个层面解释。
当服务端调用:
listen(sockfd, backlog);
它的含义不是“同时能处理多少连接”,而是:
在内核中,为「已完成连接」和「正在握手」的连接预留多大的队列空间
原因很简单:
connect() 发起连接accept() 取走连接如果 没有队列:
所以 backlog 本质上是:
内核用来缓冲“还没被用户程序处理”的连接
在 Linux 2.2+ 之后,listen() 的 backlog 含义发生了变化:
backlog = min(backlog, /proc/sys/net/core/somaxconn)
并且它影响 两个队列(简化理解):
tcp_max_syn_backlog 影响公式(近似):
实际 accept 队列长度 = min(backlog, somaxconn)
错误。
backlog 只管 “等待 accept 的缓冲”
不一定。
典型值:
512 ~ 4096(Web 服务常见)
不一定!
还要看:
cat /proc/sys/net/core/somaxconn
默认通常是:
128
如果你代码写:
listen(fd, 1024);
但实际是 128
你“调 backlog”通常是因为:
connection reset by peeraccept queue overflow排查方式:
ss -lnt
看:
Recv-Q Send-Q
如果 Recv-Q 长期接近 Send-Q → backlog 不够
✅ 应用层:
listen(fd, 1024);
✅ 系统层:
sysctl -w net.core.somaxconn=1024
✅ 应用自身:
epoll / io_uringaccept如果你愿意,我可以:
你现在是在调哪个服务?