在 Linux 中,“backlog” 通常指 TCP 监听队列(listen backlog),也就是 listen() 系统调用中的 backlog 参数,以及内核中与之相关的队列长度。下面分几种常见场景说明如何修改与优化。
int listen(int sockfd, int backlog);
backlog 表示:
accept() 的队列长度上限例如在 C 程序中:
listen(server_fd, 1024);
注意:
Linux 有两个重要内核参数:
net.core.somaxconn控制
listen()的 backlog 上限
查看:
cat /proc/sys/net/core/somaxconn
默认通常是:
128
临时修改:
sysctl -w net.core.somaxconn=4096
永久修改:
echo "net.core.somaxconn = 4096" >> /etc/sysctl.conf
sysctl -p
net.ipv4.tcp_max_syn_backlog控制半连接(SYN_RECV)队列长度
查看:
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
修改:
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
永久生效:
echo "net.ipv4.tcp_max_syn_backlog = 8192" >> /etc/sysctl.conf
sysctl -p
Linux 中 最终 backlog = min(应用 backlog, somaxconn)
例如:
listen(sock, 5000)
somaxconn = 4096
✅ 实际生效的是 4096
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0 # 不推荐开启(NAT 问题)
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_abort_on_overflow = 0
0:丢包重试1:直接返回 RST(调试时有用)netstat -s | grep -i listen
或:
ss -lnt
关注:
Recv-QSend-Q如果 Recv-Q 经常接近 backlog,说明队列不够或 accept 不及时。
| 场景 | somaxconn | tcp_max_syn_backlog |
|---|---|---|
| 普通 Web | 1024 | 2048 |
| 高并发 API | 4096 | 8192 |
| 网关 / 反向代理 | 8192 | 16384 |
修改 backlog 不只是改代码,还要调
somaxconn和tcp_max_syn_backlog
如果你愿意,可以告诉我:
我可以给你一套更精确的参数配置。