应一次只调worker_processes参数,固定其他配置,分阶段实测1→2→4→8→12,用wrk压测并监控qps、p95延迟、cpu%us三项指标同步变化,结合ulimit、somaxconn等系统条件验证真实瓶颈。

直接用压测工具组合系统监控,一次只调 worker_processes 这一个参数,其他全部锁死,才能看清它对并发吞吐的真实影响。
压测前必须拉齐的底层条件
多 worker 架构的吞吐表现,首先取决于系统是否允许它跑起来:
-
文件描述符要够用:执行
ulimit -n,值必须 ≥worker_processes × worker_connections × 1.5;否则一到高并发就报accept() failed (24: Too many open files) -
内核连接队列要放大:运行
sysctl net.core.somaxconn,确保 ≥ 65535;Nginx 的listen 80 backlog=65535也要同步配上 -
关闭干扰项:禁用 SELinux 或调宽策略;确认
events { use epoll; }已显式声明;清掉缓存:sync && echo 3 > /proc/sys/vm/drop_caches - 测试环境要隔离:客户端和 Nginx 不能在同一台机器;必须走局域网直连(推荐万兆),避免网络抖动污染结果
分阶段实测 worker\_processes 的拐点
不要跳着设 1、4、8、16,而是按物理核心数阶梯推进,观察吞吐是否线性增长、延迟是否突增:
- 先固定
worker_connections 10240,其他事件参数不变(multi_accept on、accept_mutex on) - 依次测试
worker_processes 1 → 2 → 4 → 8 → 12,每组用wrk -t4 -c2000 -d180s --latency压 3 分钟,重复 2–3 次取中位数 - 重点盯三项同步变化:QPS 是否进入平台期、P95 延迟是否跳升超 30%、CPU 用户态 %us 是否长期高于 85%
- 若从 8 升到 12,QPS 只涨 2%,但
cs(上下文切换)翻倍、r(运行队列)持续 > 8 → 说明调度开销已吃掉收益,12 不是更优解
用 wrk + 系统命令交叉验证真实瓶颈
单看 QPS 容易误判,必须结合实时系统状态判断压力是否真正落到 worker 层:
- 压测中运行
htop,观察各 CPU 核心负载方差;若差异超 40%,检查worker_cpu_affinity auto;是否生效 - 执行
top -p $(pgrep nginx | head -n 8 | xargs),确认 8 个 worker 进程的 CPU 占用是否均衡;不均可能是accept_mutex关闭或内核调度问题 - 运行
ss -s查 total 连接数,对比net.core.somaxconn;若接近上限且出现大量orphaned sockets报错,说明内核已堵住 - 用
iftop -P 80看网卡实际吞吐,若远低于物理带宽,说明瓶颈不在 Nginx,可能卡在后端或 TCP 参数(如tcp_tw_reuse未开)
识别多进程架构下的典型失衡信号
不是所有吞吐下降都怪配置,要从现象反推 worker 层行为是否异常:
- 所有 worker CPU 都打满,但 QPS 不再上升 → 瓶颈大概率在后端响应慢或网络带宽见顶,不是 worker 数不够
-
部分 worker CPU 高、其余闲置 → 检查
accept_mutex on;是否启用(默认开启),防惊群失效;也可能是负载均衡策略导致连接分配倾斜 -
大量 502 或超时,同时
upstream timed out日志密集 → 不是 worker 少,而是proxy_read_timeout过短,或后端处理阻塞了 worker 事件循环 -
TIME_WAIT 连接堆积超过 3 万且持续增长 → 需调大
net.ipv4.tcp_max_tw_buckets并启用net.ipv4.tcp_tw_reuse = 1,否则新连接会因端口耗尽被拒











