在 Linux 系统中,backlog(积压队列) 通常指 监听套接字(listening socket)的半连接/全连接队列长度,它直接影响服务的连接能力、稳定性与性能。下面从概念、作用、为何重要、调优建议几个方面说明。
在 TCP 服务中,当使用 listen() 系统调用时:
listen(sockfd, backlog);
backlog 表示 已完成 TCP 三次握手、但尚未被应用调用 accept() 的连接队列长度上限。
在 Linux 中,它实际涉及两个队列(内核实现细节):
半连接队列(SYN Queue)
SYN_RECV 状态的连接/proc/sys/net/ipv4/tcp_max_syn_backlog 影响全连接队列(Accept Queue)
accept() 的连接listen(fd, backlog) 控制的是这个队列min(backlog, net.core.somaxconn) 限制如果 backlog 太小:
accept() 不及时表现为:
connection resetECONNREFUSED在 高并发、短连接、突发流量 场景下尤为明显。
backlog 与半连接队列相关:
tcp_syncookies=1 → 提高抗攻击能力服务刚启动或重启时:
如果 backlog 经常打满,通常说明:
accept() 太慢这是一个 性能信号,而不是单纯调参数就能解决的。
ss -lnt 中 Recv-Q 接近 Send-Qnetstat -s 中:listen queue errors
ss -lnt
示例:
State Recv-Q Send-Q Local Address:Port
LISTEN 20 128 *:80
Recv-Q:当前全连接队列长度Send-Q:backlog 上限如果 Recv-Q ≈ Send-Q,说明队列经常满。
cat /proc/sys/net/core/somaxconn
默认通常是 128,对现代服务来说偏小。
listen(sockfd, 1024);
或:
sysctl -w net.core.somaxconn=1024
常见推荐值:
512 ~ 10242048 ~ 4096net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_syncookies = 1
⚠️ 注意:
共同决定。
Linux backlog 决定了服务在突发或高并发情况下,能“安全接住多少已完成 TCP 连接的客户端请求”。
配置合理可以避免连接丢失、提升稳定性,但如果应用本身处理能力不足,单纯调大 backlog 只是掩盖问题。
如果你愿意,我可以:
ss / netstat 输出