合理配置 worker_cpu_affinity 能显著提升 Nginx 多核吞吐量,需结合进程数、accept_mutex、multi_accept、worker_connections 及网卡软中断绑定协同优化,并通过 ps、taskset 和 /proc 查看实际生效情况。

合理配置 worker_cpu_affinity 能显著提升 Nginx 在多核服务器上的吞吐量,核心在于减少 CPU 缓存失效、TLB 刷新和跨 NUMA 节点内存访问。它不是“一配就快”,而是需要与进程数、系统调度、网络中断协同优化。
明确绑定逻辑:二进制掩码对应物理核心
每组二进制数代表一个 worker 进程的 CPU 使用权限,位数等于系统逻辑 CPU 总数,最低位(最右)对应 core 0:
- 双核服务器(2 个逻辑核):设
worker_processes 2,则写worker_cpu_affinity 01 10—— 第一个 worker 绑 core 0,第二个绑 core 1 - 四核服务器(4 个逻辑核):设
worker_processes 4,则写worker_cpu_affinity 0001 0010 0100 1000 - 八核服务器(8 个逻辑核):对应 8 组 8 位二进制,如
00000001 00000010 ... 10000000
注意:不要重复使用同一掩码(如 0001 0001),否则多个 worker 会争抢同一个核心。
推荐用 auto 模式简化配置
Nginx 1.9.10+ 支持 worker_cpu_affinity auto,前提是已设置 worker_processes auto 或明确数值且 ≤ 可用核心数:
- 自动按逻辑 CPU 顺序分配,避免手动计算出错
- 在虚拟机中需确认宿主机透出完整 CPU topology,否则可能误判核心数量
- 等效于手动写满位掩码,但更健壮、易维护
必须同步调整的关键配套项
仅配 worker_cpu_affinity 不足以释放多核性能,还需以下配合:
- 关闭
accept_mutex(Nginx ≥ 1.11.3 默认已关),防止 worker 间因 accept 锁串行阻塞 - 开启
multi_accept on,让单个 worker 一次处理多个新连接,降低事件唤醒开销 - 调高
worker_connections(如 10240 或 65535),并确保系统级ulimit -n和fs.file-max匹配 - 将网卡软中断(softirq)也绑定到相同 CPU 核心,避免网络包收发与 worker 处理跨核搬运数据
验证是否真正生效
重启 Nginx 后执行以下命令交叉验证:
-
ps -eo pid,args,psr | grep 'nginx: worker'—— 查看每个 worker 实际运行在哪颗 CPU(psr 列) -
taskset -cp <PID>—— 显示该进程当前 CPU 亲和性掩码 -
cat /proc/<PID>/status | grep -E "(Cpus_allowed|Cpus_allowed_list)"—— 查底层允许范围
若多个 worker 显示相同 psr 值或 Cpus_allowed_list 重叠,说明配置未生效或核心数不足。


















