在 Linux 里,“backlog” 常见于 网络编程(socket) 和 内核参数调优 场景,主要指 已完成或未完成连接队列的长度。下面按常见场景说明它的“计算方式”和含义。
在 TCP 服务器中,内核为每个 listen() 的 socket 维护两个队列:
半连接队列(SYN Queue)
全连接队列(Accept Queue)
accept() 的连接backlog 通常影响的是“全连接队列”长度。
listen(fd, backlog);
这里的 backlog 不是最终队列长度,而是一个“建议值”。
从 Linux 2.6.10 之后,全连接队列长度由以下公式计算:
max(backlog, somaxconn)
更准确地说:
全连接队列长度 = min(backlog, somaxconn)
实际是取 backlog 和 somaxconn 的最小值
somaxconn 是内核参数,表示 单个 socket 的最大全连接队列长度。
cat /proc/sys/net/core/somaxconn
默认一般是:
128
sysctl -w net.core.somaxconn=1024
或永久:
echo "net.core.somaxconn=1024" >> /etc/sysctl.conf
sysctl -p
半连接队列长度 不受 backlog 直接控制,而主要受:
net.ipv4.tcp_max_syn_backlog
影响。
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
默认常见值:
256 / 512 / 1024
ss -lnt
重点看:
Recv-Q
Send-Q
对于 listen socket:
示例:
LISTEN 0 128 0.0.0.0:8080
表示:
netstat -s | grep "listen queue"
或:
ss -tanl
如果有:
listen queue overflows
说明:
✅ backlog / somaxconn 太小
✅ 或 accept 处理太慢
min(listen backlog, net.core.somaxconn)
受 net.ipv4.tcp_max_syn_backlog 影响
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192
同时应用层:
listen(fd, 32768);
如果你是想问 backlog 在 epoll / Nginx / Redis / MySQL / 容器网络 里怎么算,也可以继续问,我可以结合具体场景详细讲。