在多路NUMA服务器上,worker_processes应按单个NUMA节点物理核心数设置(如每节点16核则设16),禁用auto;需配合numactl绑定CPU与本地内存,并通过numastat验证本地内存使用率超95%。

在多路 NUMA 架构服务器上,worker_processes 不能简单设为总逻辑核数,否则容易因跨 NUMA 节点访问内存导致延迟飙升、缓存失效严重,性能不升反降。关键是要让每个 worker 进程绑定到其本地 NUMA 节点的 CPU 核心,并限制其只使用该节点的内存。
NUMA 感知的 worker 进程数设置
先确认服务器 NUMA 拓扑:
- 运行
numactl --hardware查看 NUMA 节点数量、各节点 CPU 核心编号及本地内存大小 - 用
lscpu | grep "NUMA node"辅助验证 - 例如双路 32 核服务器(每路 16 核 + 对应本地内存),通常有 2 个 NUMA 节点(node 0 和 node 1)
此时推荐配置:
-
worker_processes 16;(每 NUMA 节点分配 1 个 worker 进程 × 本地核心数) - 或更稳妥地:每节点启动 8 个 worker,共 16 个,留出资源余量
- 避免使用
auto—— 它只按总核数启动,不感知 NUMA 边界
CPU 亲和性必须按 NUMA 节点分组绑定
不能用全局位掩码(如 0001 0010 …)随意分配;要确保每个 worker 只跑在单一 NUMA 节点的物理核心上。
- 假设 node 0 的核心是 0–7,node 1 是 16–23,则配置为:
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; # node 0 上的 8 个 workerworker_cpu_affinity 0000000100000000 0000001000000000 … ; # node 1 上的 8 个 worker(注意位宽需匹配总核数)- 更推荐使用
worker_cpu_affinity auto配合numactl启动 Nginx,由系统级工具保障 NUMA 局部性
配合内存局部性控制
CPU 绑定只是第一步,还需确保 worker 进程分配的内存来自本地 NUMA 节点。
- 启动 Nginx 前,用
numactl --cpunodebind=0 --membind=0 /usr/sbin/nginx(node 0) - 或对每个 master 启动独立实例,分别绑定不同节点(适合超大规模部署)
- 验证是否生效:
numastat -p $(pgrep nginx)查看 per-node 内存分配比例,理想情况 >95% 来自本地节点
其他配套调优要点
NUMA 优化不是孤立动作,需同步调整关联参数:
-
worker_rlimit_nofile值需 ≥ 单节点最大连接数 × 本节点 worker 数,且系统级ulimit -n必须同步提高 -
events { accept_mutex off; multi_accept on; }减少锁竞争,提升多 worker 并发接入效率 - 禁用 swap:
echo 0 > /proc/sys/vm/swappiness,防止 NUMA 内存不足时跨节点换页 - 检查 BIOS 中是否启用 Node Interleaving —— 必须关闭,否则 NUMA 拓扑被隐藏











