net.core.somaxconn是Linux内核参数,定义每个监听socket的已完成连接队列长度;worker_connections是Nginx参数,表示单个工作进程可处理的最大并发连接数;二者需协同调优,推荐somaxconn ≥ worker_connections / worker_processes,并同步调整tcp_max_syn_backlog、worker_rlimit_nofile等关联参数。

worker_connections 和 net.core.somaxconn 是两个不同层级但紧密耦合的关键参数:前者控制 Nginx 进程内部可管理的并发连接数,后者决定 Linux 内核为每个监听 socket 维护的“已完成连接队列”(accept queue)长度。两者不匹配时,高并发下会出现连接丢弃、502/503、请求积压等现象,尤其在突发流量或短连接场景中尤为明显。
理解两者的职责边界
worker_connections 是 Nginx 事件循环能同时处理的活跃连接上限(含 keepalive 空闲连接),属于应用层资源调度范畴;而 net.core.somaxconn 是内核为每个 listen() socket 预留的、已完成三次握手但尚未被 accept() 取走的连接槽位数,属于网络协议栈底层缓冲机制。
若 somaxconn 过小(如默认 128 或 1024),当瞬时 SYN+ACK 完成量超过该值,后续合法连接会被内核直接丢弃(不发 RST),客户端表现为超时或重传失败——此时即使 worker_connections 设为 65535 也无济于事,因为连接根本进不到 Nginx。
数值协同的基本原则
理想情况下应满足:somaxconn ≥ worker_connections / worker_processes,且必须留出余量应对连接分布不均和突发峰值。
- 例如:8 核服务器配置
worker_processes 8、worker_connections 65535,则单个 listen socket 的队列需承载约 65535 ÷ 8 ≈ 8200 个待 accept 连接;建议将net.core.somaxconn设为 16384 或更高(常见推荐值 4096–65536) - 若使用
multi_accept on(推荐开启),Nginx 单次 epoll_wait 可批量取走队列中全部就绪连接,进一步降低队列积压风险,此时对 somaxconn 的压力略小,但仍不可低于 worker_connections / worker_processes - 注意:somaxconn 是 per-listen socket 值,不是全局总和;多个 server{} 块监听同一端口(如多域名共用 443)共享同一个队列,需按最大预期并发估算
配套必须调整的内核与系统参数
仅调大 somaxconn 不足以支撑海量并发,还需同步强化关联机制:
-
net.ipv4.tcp_max_syn_backlog:控制“未完成连接队列”(SYN queue)长度,应 ≥ somaxconn(推荐设为 2×somaxconn),避免 SYN 包被丢弃 -
net.ipv4.tcp_tw_reuse = 1:允许 TIME-WAIT 套接字在安全条件下复用于新连接,缓解端口耗尽(尤其作为客户端或反向代理时) -
worker_rlimit_nofile必须 ≥ worker_connections,且操作系统级 ulimit -n 要同步设为同等或更大值(如 100000),否则 Nginx 启动即报错或运行中触发 EMFILE 错误 - Nginx 配置中建议启用
accept_mutex off(高并发场景),避免多进程争抢 accept 锁导致性能下降
验证与观测方法
调优后需通过实际指标确认效果:
- 检查内核队列状态:
ss -lnt查看 Recv-Q 列是否长期接近或等于 somaxconn 值;若持续满载,说明仍存在瓶颈 - 观察 Nginx 状态页(需启用 stub_status)中的
Accepts与Handled差值:若差值持续扩大,可能有连接在队列中丢失或未被及时 accept - 抓包验证:用
tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'观察是否存在大量重复 SYN 或无响应 ACK,辅助判断队列溢出 - 压测时关注错误率(如 ab 报错 “Connection refused” 或 “Connection timed out”),常指向 somaxconn 不足











