通过 worker_cpu_affinity 配置可将 Nginx 工作进程启动时绑定至指定 CPU 核心,需结合 worker_processes 使用;须先用 lscpu 和 nproc 确认真实拓扑,优先绑定物理核以提升缓存命中率;推荐新手用 auto 模式,手动配置需按逻辑 ID 精确掩码;同时必须开启 master_process、关闭 accept_mutex,并调优 multi_accept、reuseport 及文件描述符限制;最后用 ps、taskset 和 mpstat 验证绑定效果。

直接通过 worker_cpu_affinity 指令配置,配合 worker_processes 使用,就能让每个 Nginx 工作进程固定运行在指定 CPU 核心上。这不是运行时动态切换,而是启动时一次性绑定,之后全程稳定驻留——这是提升缓存命中率、减少上下文切换抖动的关键。
确认真实 CPU 拓扑再写配置
别直接按“8核就写8个0001”套用。先执行:
-
lscpu | grep -E "CPU\(s\)|Core\(s\) per socket|Socket\(s\)"—— 看清物理核数、逻辑核数、是否开启超线程 -
nproc --all—— 得到系统当前可用逻辑 CPU 总数
例如输出显示 “CPU(s): 16”,但 “Core(s) per socket: 8”,说明是 2 路 CPU × 8 物理核 + 超线程开启。此时应优先绑定物理核(如用逻辑 ID 0,2,4…14),避免两个 worker 挤在同一物理核上争抢 L1/L2 缓存。
两种主流写法:auto 自动适配 or 手动掩码精准控制
推荐新手或云环境用 auto:
worker_processes auto;-
worker_cpu_affinity auto;—— Nginx 1.9.10+ 自动按物理核顺序分配,跳过超线程对称核,位序不手算、不易错 - 想只用前 4 个逻辑 CPU:写
worker_cpu_affinity auto 00001111;
手动控制更透明(适合物理服务器):
- 4 物理核 →
worker_processes 4;+worker_cpu_affinity 0001 0010 0100 1000; - 8 物理核(HT 开启,逻辑 ID 为 0,2,4,6,8,10,12,14)→
worker_cpu_affinity 00000001 00000100 00010000 01000000 0000000100 0000010000 0001000000 0100000000;(也可用十六进制01 04 10 40 0100 0400 1000 4000更易读)
必须同步调整的配套项
光绑核不够,还要切断干扰调度的路径:
- 确保
master_process on;(默认开启,关闭后worker_cpu_affinity不生效) - 关闭 accept 锁:
accept_mutex off;(1.11.3+ 默认已关,旧版本需显式关闭) - 高并发建议加:
multi_accept on;和reuseport on;,让内核在 socket 层分发连接,避免用户态争抢 - 设好
worker_rlimit_nofile并同步调大系统ulimit -n,否则连接数上不去,绑再准也白搭
验证是否真绑上了
别信配置文件,要看运行时效果:
- 查每个 worker 运行在哪颗逻辑 CPU 上:
ps -eo pid,args,psr | grep 'nginx: worker'—— 第三列数字应是 0、1、2、3… 且不重复 - 查某 worker 允许跑的 CPU 列表:
taskset -cp <pid></pid>—— 输出类似pid 12345's current affinity list: 2表示只允许在 CPU 2 运行 - 压测时跑
mpstat -P ALL 1—— 各核利用率应大致均衡,没有某核长期 100% 而其他核空闲


















