Nginx的CPU绑定是静态的,通过worker_cpu_affinity在启动时为每个worker进程固定分配物理核心,不支持运行时按需动态绑定;必须配合master_process开启,掩码位数须≥worker_processes数且严格对齐物理拓扑。

直接在 nginx.conf 的 main 块(即最外层、events 块之前)配置 worker_cpu_affinity,配合已设的 worker_processes 数量,就能为每个 worker 进程分配独立的 CPU 亲和力。
明确物理核心数,再定进程数
先确认服务器真实的物理 CPU 核心总数,而不是逻辑核(含超线程)或容器虚核:
- 执行
lscpu | grep -E "Core\(s\) per socket|Socket\(s\)",相乘得物理核数(如 2 sockets × 12 cores = 24) -
nproc --all只作对比参考,它返回的是逻辑核数 - 8c16t 机器若设
worker_processes 16,两个 worker 可能挤在同一物理核上,争抢 L1/L2 缓存,反而降低性能
推荐用 auto 模式自动绑定
Nginx ≥ 1.9.10 支持 worker_cpu_affinity auto,它会跳过超线程对称逻辑核,把每个 worker 绑定到不同物理核的第一个线程(如逻辑 CPU 0、2、4…),比手动写二进制掩码更可靠、易维护:
- 物理核数为 4 → 写
worker_processes 4; worker_cpu_affinity auto; - 物理核数为 16 → 写
worker_processes 16; worker_cpu_affinity auto; - 该配置必须放在 main 块,且
master_process on;需保持开启(默认就是开启)
手动指定掩码的写法与规则
如果需精细控制或使用旧版 Nginx,可手动写二进制掩码。每位代表一个逻辑 CPU,从低位(最右)开始编号为 CPU 0:
- 4 核机器:
worker_processes 4;+worker_cpu_affinity 0001 0010 0100 1000;(每个 worker 独占一个逻辑核) - 4 核机器只启 2 个 worker:
worker_processes 2;+worker_cpu_affinity 0101 1010;(第 1 个 worker 绑 CPU 0 和 CPU 2,第 2 个绑 CPU 1 和 CPU 3) - 注意:掩码位数必须等于系统逻辑 CPU 总数;多于 8 个 worker 时,稳定性可能下降,一般不建议超过 8
容器与云环境要严格对齐 vCPU
在 Docker 或 Kubernetes 中,worker_processes auto 默认读宿主机核数,极易越界:
- K8s Pod 设置了
resources.limits.cpu: "4"→ 显式写worker_processes 4; worker_cpu_affinity auto; - Docker 运行时限制 2 个 vCPU → 写
worker_processes 2; worker_cpu_affinity auto; - OpenVZ 等老旧虚拟化平台常返回
nproc= 1,auto会退化为单进程,必须显式覆盖
验证是否生效:重启后运行 ps -eo pid,psr,comm | grep nginx,每个 worker 的 PSR 列应稳定落在不同 CPU 编号;再用 taskset -cp <pid> 查看绑定情况。若 PSR 频繁跳变,说明亲和力未生效,需检查配置位置、master 进程状态及系统是否禁用了 CPU 亲和策略。


















