要让Nginx worker进程真正稳定运行在指定物理CPU核上,关键是从硬件拓扑出发,确保独占物理核、避开超线程、阻断跨核调度并验证生效:先用lscpu确认物理核心数,worker_processes设为物理核数;worker_cpu_affinity掩码须严格对齐物理核位序,推荐用auto模式自动适配;同时关闭accept_mutex、开启multi_accept和reuseport,并绑定网卡软中断;最后通过ps、taskset和mpstat验证绑定效果。

要让 Nginx worker 进程真正稳定运行在指定物理 CPU 核上,关键不是凑齐几个“1”,而是从硬件真实拓扑出发,确保每个 worker 独占一个物理核心、避开超线程干扰、阻断跨核调度路径,并验证是否实际生效。
先确认物理核心数,别被超线程迷惑
超线程(HT)会让一个物理核暴露为两个逻辑 CPU,但 L1/L2 缓存和执行单元是共享的。两个 worker 绑在同一个物理核的不同逻辑 ID 上,反而会争抢资源。
- 运行 lscpu | grep -E "Core\(s\) per socket|Socket\(s\)",算出物理核心总数(例如:2 sockets × 8 cores = 16 物理核)
- 再用 nproc 或 lscpu | grep "CPU(s):" 查逻辑核总数(如显示 32,说明 HT 已开)
- 若你有 16 物理核,就设 worker_processes 16;不建议设 32,除非压测明确证明小包低延迟受益于全逻辑核
掩码必须严格对齐物理核,位序不能错
每组掩码是一个二进制数,最低位(最右边)永远对应 CPU 0,从右往左依次为 bit 0、bit 1、bit 2……
- 4 物理核 → 推荐写法:worker_processes 4; + worker_cpu_affinity 0001 0010 0100 1000;
- 8 物理核 + HT(共 16 逻辑核),只用前 8 个物理核的第一个线程(逻辑 ID 0,2,4…14)→ 可写为 worker_cpu_affinity 01010101 01010101;
- 更稳妥:用十六进制简化,如 8 核写成 01 02 04 08 10 20 40 80,不易数错位
- 错误示例:8 核却只写 4 组掩码,或位数超过系统逻辑 CPU 总数,会导致部分 worker 失去控制
优先用 auto 模式起步,省错又适配
Nginx ≥ 1.9.10 支持 auto 模式,它自动跳过超线程对称核,按物理核顺序分配,比手动写掩码更健壮,尤其适合云环境或 NUMA 架构。
- worker_cpu_affinity auto; —— 自动为每个物理核分配一个 worker,L1/L2 缓存局部性最优
- worker_cpu_affinity auto 00001111; —— 限制只使用前 4 个逻辑 CPU(对应前 2 或 4 物理核),适合容器限频场景
- 不建议混用:比如 worker_processes 8 却只给 4 个掩码值,剩余 worker 会 fallback 到默认调度
绑定只是起点,必须同步关闭干扰项
光写 worker_cpu_affinity 不调其他参数,等于绑住车轮却踩着刹车——worker 被固定了,但还在排队等锁、一次只收一个连接、软中断在隔壁核收包再搬运过来。
- accept_mutex off;:关闭连接接入串行锁(Nginx ≥ 1.11.3 默认已关,旧版本务必显式关)
- multi_accept on;:让每个 worker 一次从内核事件队列取多个就绪连接,减少 epoll 唤醒次数
- reuseport:在 listen 指令后加上,让内核在 socket 层就把连接均匀分发到各 worker,绕过用户态锁竞争
- 把网卡软中断也绑到相同物理核:cat /proc/interrupts | grep eth 找 IRQ 编号,再用 echo $MASK > /proc/irq/$IRQ/smp_affinity_list 绑定
验证是否真的绑住了,别信配置信数据
重启 Nginx 后,必须通过运行时命令确认效果,否则所有配置都可能白做。
- 查各 worker 当前运行在哪颗核:ps -eo pid,args,psr | grep 'nginx: worker' —— 第三列(psr)应稳定为 0、1、2、3…一一对应
- 查某进程允许跑的 CPU 列表:taskset -cp <pid> —— 输出类似 pid 12345's current affinity list: 2 表示只允许在 CPU 2 运行
- 压测时观察:mpstat -P ALL 1 —— 各核利用率应相对均衡,没有某核长期 100% 其他核空闲的情况

















