tcp_max_syn_backlog 控制 SYN 半连接队列长度,决定高并发下建连请求是否被丢弃;需与 net.core.somaxconn 匹配设置(如均设为 65535),并配合 Nginx listen backlog 参数,避免连接建立阶段卡顿。

net.ipv4.tcp_max_syn_backlog 是 Linux 内核中直接影响 Nginx 高并发连接建立能力的关键参数之一,它控制的是 SYN 半连接队列(SYN queue)的最大长度,直接决定服务器能否在瞬时高并发下不丢弃客户端的建连请求。
为什么 tcp_max_syn_backlog 会影响 Nginx 并发?
当客户端发起 TCP 连接(发送 SYN 包),服务端收到后进入 SYN_RCVD 状态,并将该连接暂存于 SYN 队列中,等待客户端返回 ACK 完成三次握手。这个队列由内核维护,其容量上限就是 tcp_max_syn_backlog 的值。
- 若新来的 SYN 请求超过该队列长度,内核默认静默丢弃 SYN 包(不回复 RST),客户端会重试(受
tcp_syn_retries控制); - 在流量突发、Nginx worker 处理不过来或 accept 队列(accept queue)积压时,SYN 队列就成为第一道缓冲;
- 若该值过小(如默认的 1024 或更低),即使 Nginx 和系统其他资源充足,也会在连接建立阶段就“卡住”,表现为大量连接超时、
ss -s中SYN_RECV数量长期高位、netstat出现大量SYN_RECV状态连接。
合理设置 tcp_max_syn_backlog 的要点
-
必须与
net.core.somaxconn协同调整:somaxconn控制 accept 队列(已完成三次握手、等待accept()调用的连接),而tcp_max_syn_backlog控制 SYN 队列。两者需匹配,一般建议:tcp_max_syn_backlog ≥ somaxconn- 常见生产配置:都设为
32768、65535或262144
不能只看理论并发数,要看建连速率:
比如每秒涌入 5000 个新连接,而tcp_max_syn_backlog = 1024,哪怕后续处理很快,初始阶段就会持续丢包。应按峰值建连 QPS × 握手延迟(通常几十毫秒)估算所需缓冲。注意
tcp_syncookies的干扰:
当net.ipv4.tcp_syncookies = 1(默认开启),内核在队列满时会启用 syncookie 机制,绕过队列限制,但这是兜底方案,会增加 CPU 开销且不支持部分 TCP 扩展(如时间戳)。不应依赖 syncookies 来掩盖tcp_max_syn_backlog设置过小的问题。-
验证是否生效:
cat /proc/sys/net/ipv4/tcp_max_syn_backlog ss -s | grep "SYN-RECV" # 观察半连接数量趋势 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' # 查看各状态连接数
推荐配置示例(适用于万级至十万级并发)
# 临时生效 sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65535 sudo sysctl -w net.core.somaxconn=65535 # 永久生效:写入 /etc/sysctl.conf echo 'net.ipv4.tcp_max_syn_backlog = 65535' >> /etc/sysctl.conf echo 'net.core.somaxconn = 65535' >> /etc/sysctl.conf sudo sysctl -p
同时确保 Nginx listen 指令显式指定足够大的 backlog:
listen 80 backlog=65535;
注意:Nginx 的
backlog=值不能超过somaxconn,否则会被内核自动截断。
小结
tcp_max_syn_backlog 不是“越大越好”,但对高并发场景绝不能沿用默认值。它和 somaxconn 共同构成连接接入链路的“入口闸机”,调小了会丢连接,调大了能稳住建连洪峰——配合 Nginx worker 连接数、文件描述符限制等参数,才能真正释放十万并发潜力。











