在 Linux 中,backlog 通常指 网络连接队列的长度,尤其是在 TCP 服务端监听 socket 中。它决定了内核允许多少个尚未被 accept 的连接排队等待。
下面分层解释,避免混淆。
在 Linux 网络编程中,当你创建一个 TCP 服务时,通常会调用:
listen(fd, backlog);
这里的 backlog 表示:
已完成连接(ESTABLISHED)但尚未被应用程序 accept 的最大队列长度
Linux 内核中,TCP 实际上维护 两个队列:
/proc/sys/net/ipv4/tcp_max_syn_backlog 影响listen() 中的 backlog 主要限制的是这个队列✅ backlog ≈ 全连接队列长度上限
在 Linux 2.2+ 中:
listen()的backlog不是精确值
实际队列长度 =
min(backlog, net.core.somaxconn)
cat /proc/sys/net/core/somaxconn
默认通常是:
128
意思是:
listen(fd, 1024)somaxconn✅ 想真正提高 backlog,必须同时调大 somaxconn
当全连接队列满了:
表现:
accept() 来不及处理✅ 错,那是 tcp_max_syn_backlog
✅ 错,太大:
✅ 错,它只是 等待 accept 的连接数
listen(fd, 1024);
sysctl -w net.core.somaxconn=1024
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
永久生效:
/etc/sysctl.conf
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 2048
netstat -s | grep -i listen
或:
ss -lnt
关注:
Recv-QSend-QLinux backlog 是 TCP 全连接队列的长度上限,限制已完成三次握手、等待 accept 的连接数量,不是并发连接数,也不是半连接数。
如果你愿意,我可以: