nginx多进程高效利用多核cpu的关键在于worker_processes设为物理核心数(推荐auto)并配合worker_cpu_affinity绑定专属核心,辅以ulimit、numa、网卡队列等系统级协同调优,避免跨核调度与缓存失效。

Nginx 多进程架构天生适配多核 CPU,但“启动多个 worker”只是起点,真正高效利用关键在于让每个 worker 稳定运行在专属核心上,减少跨核调度、缓存失效和内存访问延迟。
worker_processes 必须匹配物理核心数
设为 auto 是最稳妥的选择,Nginx 会自动读取系统物理核心数(非超线程数)并启动对应数量的 worker 进程。例如 16 核服务器就启 16 个 worker。
- 手动设置时,优先参考
lscpu | grep "Core(s) per socket"和Socket(s)相乘得出物理核总数 - 避免设为远高于物理核数(如 32 核机器设 64),否则引发频繁上下文切换与锁竞争
- 容器或虚拟机中以
nproc输出为准,而非宿主机 cpuinfo
CPU 亲和性绑定是性能跃升的关键
默认情况下,Linux 调度器可能把 worker 进程动态迁移到任意核心,导致 L1/L2 缓存反复失效。启用 worker_cpu_affinity 可强制一对一绑定:
- 推荐写法:
worker_cpu_affinity auto;(Nginx 1.9.10+ 支持,自动完成最优映射) - 手动配置示例(8 核):
worker_cpu_affinity 00000001 00000010 ... 10000000; - 每组掩码对应一个 worker,位为 1 表示绑定该核心,顺序必须与 worker 启动序号严格一致
系统级协同调优不可少
Nginx 绑核只是局部优化,还需配套调整:
- 增大文件描述符限制:在
nginx.conf中加worker_rlimit_nofile 65535,并在/etc/security/limits.conf中同步设置nginx soft nofile 65535 - 关闭非必要服务(如 avahi-daemon、bluetooth)减少后台中断干扰
- 对于多队列网卡,用
ethtool -L eth0 combined N启用硬件队列,并配合 RPS 将NET_RX软中断分流到与 worker 相同的核心 - NUMA 架构下,用
numactl --cpunodebind=0 --membind=0 nginx启动,避免跨节点内存访问
验证是否真正生效
配置后不能只看配置文件,要实测确认:
-
ps axo pid,comm,psr | grep nginx | grep -v master查看各 worker 实际运行的核心编号(PSR 列) -
taskset -cp <pid></pid>输出应显示单一 CPU ID -
htop中开启 PROCESSOR 列,观察各 worker 是否稳定落在预期核心且负载均衡 -
mpstat -P ALL 1查各核利用率,理想状态是无明显单核打满、其余空闲的现象











