net.core.somaxconn是内核监听队列长度,需与Nginx listen backlog对齐(如均设为65535),否则高并发连接会被静默丢弃;还需同步调优tcp_max_syn_backlog、tcp_tw_reuse、swappiness及文件描述符限制。

要让 Nginx 真正撑住万级并发,光改 worker_connections 不够,必须打通内核 TCP 栈——关键就在 net.core.somaxconn 这个参数的协同调优。
理解 somaxconn 的实际作用
它不是总连接数限制,而是内核为每个 listen() socket 维护的“已完成三次握手、但还没被 Nginx accept() 取走”的连接队列长度。这个队列一满,后续合法连接就会被内核静默丢弃(不发 RST),客户端表现为超时或重连失败。
默认值通常是 128 或 1024,在高并发下极易成为瓶颈,哪怕 Nginx 配置了 65535 个连接也进不来。
与 Nginx 参数的数值匹配原则
真正起效的连接队列长度,是 min(net.core.somaxconn, nginx listen backlog)。两者必须对齐,否则高配无效。
- 若使用
worker_processes auto(如 8 核),worker_connections 65535,则单个监听端口平均需承载约 8200 个待 accept 连接 - 推荐将
net.core.somaxconn设为 65535 或更高(如 131072),并同步在 Nginx 中显式配置:listen 80 backlog=65535; - 多个
server{}共用同一端口(如 443 上托管多个域名)时,仍共享同一个队列,按最大预期并发估算
必须同步调整的关联内核参数
只调 somaxconn 是单点优化,容易被其他环节卡住:
-
net.ipv4.tcp_max_syn_backlog:控制“未完成连接”(SYN 队列)长度,建议设为与somaxconn相同或两倍(如 65535 → 131072) -
net.ipv4.tcp_tw_reuse = 1:允许 TIME-WAIT 套接字复用于新连接,缓解主动发起请求方(如网关、微服务)的端口耗尽问题 -
vm.swappiness = 10:降低交换倾向,保障高并发下内存响应稳定
配套系统与 Nginx 配置不可遗漏
内核调优只是基础,还需确保资源链路畅通:
- 检查并提升文件描述符上限:
ulimit -n 65535(临时)+/etc/security/limits.conf永久配置 - Nginx 内配置
worker_rlimit_nofile 65535;,使进程能真正使用到该限制 - 启用
multi_accept on;,让单次事件循环尽可能多地从队列中取走就绪连接 - 确认
use epoll;已启用,并关闭accept_mutex(高并发下减少锁竞争)


















