Nginx的worker_cpu_affinity用于将worker进程绑定到指定CPU核心以减少上下文切换和缓存失效,需结合NUMA拓扑、worker数量及负载合理配置,错误绑定反而降低性能。

Nginx 的 worker_cpu_affinity 是一个关键调优参数,用于将每个 worker 进程固定到特定 CPU 核心上,减少上下文切换和缓存失效,从而提升高并发场景下的性能稳定性。它不是“开了就快”,而是需要结合硬件拓扑、worker 数量和负载特征来合理配置。
理解 CPU 亲和性与 NUMA 架构的影响
现代服务器多为多路 CPU + NUMA 架构。若未绑定,worker 进程可能在不同物理 CPU 或跨 NUMA 节点调度,导致内存访问延迟升高(远端内存带宽低、延迟高)。worker_cpu_affinity 的本质是通过 pthread_setaffinity_np() 系统调用设置进程的 CPU 亲和掩码,让 OS 调度器只在指定核心上运行该 worker。
- 使用
lscpu查看 CPU 核心编号、socket 分布和 NUMA 节点映射 - 用
numactl --hardware确认每个节点对应的 CPU 和内存范围 - 优先让一个 worker 绑定到同一 NUMA 节点内的单个核心(如 socket 0 的 core 0),避免跨节点调度
配置 worker_cpu_affinity 的正确写法
该指令必须配合 worker_processes auto 或明确数值使用,且仅在 main 上下文中生效。格式为按 worker 序号顺序列出二进制掩码(十六进制或空格分隔的位掩码)。
- 4 核 CPU,启用 4 个 worker,一一绑定:
worker_processes 4;<br>worker_cpu_affinity 0001 0010 0100 1000;
- 8 核(2 路 × 4 核),想让每个 socket 各跑 2 个 worker:
worker_processes 4;<br>worker_cpu_affinity 00000011 00000011 00001100 00001100;
(需根据实际拓扑调整) - 更清晰写法(推荐):用十六进制,如
worker_cpu_affinity 01 02 04 08;对应 core 0~3
验证是否生效与常见误区
配置后必须重载 Nginx(nginx -s reload),并检查实际绑定状态。
- 查 worker 进程 PID:
ps -eo pid,comm,psr | grep nginx | grep -v grep(psr列显示当前运行核心) - 用
taskset -cp <pid>查看具体亲和掩码,确认是否匹配预期 - 误区一:worker 数量 > CPU 核心数时强行绑定会导致核心争抢,反而降低性能
- 误区二:在虚拟机中开启该选项可能无效或适得其反(宿主机已做调度,Guest 内再绑意义有限)
- 误区三:忽略超线程(HT)——通常建议绑定到物理核(如 core 0 和 core 1),而非逻辑核 0/1(同属一个物理核)
搭配其他参数协同优化
CPU 绑定只是性能调优的一环,需与以下设置配合才能发挥最大效果:
-
worker_rlimit_nofile:提高单个 worker 可打开文件数,避免连接数受限 -
epoll事件模型(Linux 默认)+multi_accept on:让每个 worker 尽可能一次接受多个新连接 -
sendfile on;+tcp_nopush on;:减少内核态拷贝,提升静态文件传输效率 - 关闭不必要的模块(如未用 Lua 就不编译 ngx_lua),减小 worker 内存占用和指令路径长度



















