nginx worker_processes 应设为物理cpu核心数,而非逻辑核数;需配合worker_cpu_affinity auto绑定独立物理核以减少调度干扰、提升缓存命中率,并在容器/k8s中严格按vcpu配额手动指定。

直接设为 物理核心数,不是逻辑核数,也不是“越多越好”。Nginx 的每个 worker 是单线程事件模型,绑定到独立物理核才能减少调度干扰、提升缓存命中率。
先确认真实物理核心数
别被超线程(HT)或容器虚拟核数带偏。执行:
- lscpu | grep -E "Core\(s\) per socket|Socket\(s\)" → 相乘得物理核总数(例如:2 sockets × 12 cores = 24)
- nproc --all → 查逻辑核数(仅作对比参考)
常见误区:8c16t 机器若设 worker_processes 16,两个 worker 可能挤在同一物理核上,反而争抢 L1/L2 缓存。
配置方式:推荐显式指定 + 自动绑核
在 nginx.conf 的 main 块(最外层)写:
- 物理核数为 4 →
worker_processes 4;+worker_cpu_affinity auto; - 物理核数为 16 →
worker_processes 16;+worker_cpu_affinity auto;
auto 模式(Nginx ≥ 1.9.10)会自动跳过超线程对称逻辑核,优先把每个 worker 绑定到不同物理核的第一个线程(如逻辑 CPU 0、2、4…),比手动写掩码更可靠、易维护。
容器和云环境必须手动对齐 vCPU 配额
在 Docker 或 Kubernetes 中,worker_processes auto 默认读宿主机核数,极易过载:
- K8s Pod 设置了
resources.limits.cpu: "4"→ 就写worker_processes 4; - Docker 运行时限制了 2 个 vCPU → 写
worker_processes 2;,并配worker_cpu_affinity auto; - OpenVZ 或老旧虚拟化平台:
nproc常返回 1,auto会退化为单进程,必须显式覆盖
验证是否真正生效
重启 Nginx 后执行:
-
ps -eo pid,psr,comm | grep nginx → 每个 worker 的
PSR列应稳定落在不同 CPU 编号上(不跳变) -
taskset -cp
→ 输出应显示该进程只允许运行在 1 个物理核对应的一组逻辑 CPU 上(如 0或0,2)
若 PSR 频繁变化,说明绑定未生效,需检查 master_process on; 是否开启(默认开启)、配置位置是否在 main 块、以及系统是否禁用了 CPU 亲和力策略。











