优化 Linux 中的 backlog,通常指优化 网络 socket 的 backlog(半连接/全连接队列),目的是提升高并发场景下的连接处理能力,减少丢包和连接失败。下面从 原理 → 关键参数 → 优化步骤 → 常见场景 系统说明。
在 Linux 网络编程中,backlog 与 TCP 三次握手密切相关,主要涉及两个队列:
net.ipv4.tcp_max_syn_backlog 控制
listen(fd, backlog)中的 backlog 不是最大值,而是和内核参数共同作用
net.core.somaxconncat /proc/sys/net/core/somaxconn
✅ 建议:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog✅ 建议:
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies✅ 建议:
net.ipv4.tcp_syncookies = 1
net.core.netdev_max_backlog✅ 建议:
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_abort_on_overflow✅ 调试时可开启:
net.ipv4.tcp_abort_on_overflow = 1
⚠ 生产环境不建议长期开启
vim /etc/sysctl.conf
添加或修改:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.core.netdev_max_backlog = 65535
生效:
sysctl -p
listen 80 backlog=65535;
或:
listen 80 default backlog=65535;
serverSocket.bind(new InetSocketAddress(port), 65535);
Tomcat:
server.tomcat.accept-count=65535
tcp-backlog 65535
netstat -s | grep -i listen
关注:
times the listen queue of a socket overflowedSYNs to LISTEN sockets dropped✅ 有数值说明 backlog 不够
ss -lnt
示例:
Recv-Q Send-Q Local Address:Port
128 128 0.0.0.0:80
Recv-Q ≈ Send-Q → 队列满somaxconn + tcp_max_syn_backlog 调大❌ 不能无限调大
✅ 调优顺序:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.core.netdev_max_backlog = 65535
如果你愿意,可以告诉我:
connection refused / timeout我可以给你一套 针对你业务的精确优化方案。