调大 net.core.somaxconn 是提升 Nginx 突发建连能力最有效的内核级手段,它决定已完成三次握手但未被 accept 的连接队列上限;默认 128 极易导致连接被内核静默丢弃,引发 Connection refused、超时及重传,必须设为至少 8192(推荐 65535),并同步调大 nginx listen backlog 和 tcp_max_syn_backlog。

直接调大 net.core.somaxconn 是提升 Nginx 应对突发建连最有效的内核级手段之一。它解决的是“连接已到、但还没被 Nginx 接收”这一关键卡点,不是锦上添花,而是避免大量连接在内核门口就被丢弃。
为什么 somaxconn 会成为突发建连的瓶颈
当大量客户端同时发起 TCP 连接(比如秒杀、活动开抢、压测),Linux 内核为每个监听端口维护一个“已完成三次握手、等待应用 accept”的队列,这个队列长度上限就是 net.core.somaxconn。默认值通常只有 128。
一旦队列满,新到达的 SYN-ACK 就无法入队,内核会直接丢弃或不回复 ACK,客户端表现为:
- Connection refused(服务端拒绝)
- Connect timeout(连接超时)
- TCP 重传后最终失败
这不是 Nginx 慢,是连接根本没进到 Nginx 的事件循环里。
推荐设置值与生效方式
数值不能拍脑袋定,需结合服务器内存和预期并发量:
- 常规高并发场景:设为 65535
- 16GB+ 内存、百万级连接需求:可设为 262144
- 不要低于 8192 —— 实验表明该值即可将错误率从 1.5% 降至接近 0
临时生效(立即起效,重启失效):
echo 65535 > /proc/sys/net/core/somaxconn
永久生效(写入配置并加载):
在 /etc/sysctl.conf 中添加:
net.core.somaxconn = 65535
然后运行:sudo sysctl -p
必须同步调整 Nginx listen backlog
Nginx 的 listen 指令中的 backlog 参数,实际受限于 somaxconn。比如你写 listen 80 backlog=65535;,但内核 somaxconn=128,那真正生效的仍是 128。
所以务必显式配置并保持对齐:
listen 80 backlog=65535;
若使用 Kubernetes Ingress NGINX Controller,它会自动读取 somaxconn 值作为默认 backlog,但仍建议在 ConfigMap 中显式声明以确保可控。
别漏掉配套参数:SYN 队列也要扩容
somaxconn 管的是“已完成连接”队列,而“刚收到 SYN、尚未完成三次握手”的连接由另一个参数控制:net.ipv4.tcp_max_syn_backlog。
它同样需要调大,否则 SYN 包在更早阶段就被丢弃:
- 建议设为与
somaxconn相同或更高,例如 65535 或 262144 - 同样写入 /etc/sysctl.conf 并 sysctl -p 加载
这两个参数协同工作,才能完整打通从 SYN 到 accept 的整条建连通路。











