NUMA架构感知的Nginx在多路服务器中如何进行核心绑定(CPU Affinity)的进阶调优?
- 内容介绍
- 文章标签
- 相关推荐
本文共计935个文字,预计阅读时间需要4分钟。
在配置双路或多路CPU插卡的服务器上,`worker_processes auto` 会将总逻辑核数(如64核)全部用于工作进程。但实际上,每个NUMA节点可能只有32个物理核心,跨节点调度会导致内存访问延迟翻倍。测试中,QPS下降40%以上时,`perf` 显示 `mem_load_retired.l3_miss` 指标上升,表明内存访问延迟显著。
正确做法是先确认拓扑:
-
lscpu | grep -E "(Socket|Core|NUMA)"→ 查 Socket 数与每 Socket 物理核数 -
numactl --hardware→ 看每个 node 的 CPU 列表和本地内存容量 -
cat /sys/devices/system/node/node*/cpulist→ 精确到每个核心编号归属
例如双路 16 核/插槽(共 32 物理核),应设:worker_processes 32,而非 64(超线程数)或 auto。
worker_cpu_affinity 手动分段绑定比 auto 更可靠
Nginx 的 auto 模式在 NUMA 场景下不感知节点边界,可能把 worker 0–15 分配到 node 0 的 CPU 0–15,但 worker 16–31 却落到 node 1 的 CPU 32–47 —— 表面“绑了”,实则跨节点访问内存。必须手动按 node 切分掩码。
本文共计935个文字,预计阅读时间需要4分钟。
在配置双路或多路CPU插卡的服务器上,`worker_processes auto` 会将总逻辑核数(如64核)全部用于工作进程。但实际上,每个NUMA节点可能只有32个物理核心,跨节点调度会导致内存访问延迟翻倍。测试中,QPS下降40%以上时,`perf` 显示 `mem_load_retired.l3_miss` 指标上升,表明内存访问延迟显著。
正确做法是先确认拓扑:
-
lscpu | grep -E "(Socket|Core|NUMA)"→ 查 Socket 数与每 Socket 物理核数 -
numactl --hardware→ 看每个 node 的 CPU 列表和本地内存容量 -
cat /sys/devices/system/node/node*/cpulist→ 精确到每个核心编号归属
例如双路 16 核/插槽(共 32 物理核),应设:worker_processes 32,而非 64(超线程数)或 auto。
worker_cpu_affinity 手动分段绑定比 auto 更可靠
Nginx 的 auto 模式在 NUMA 场景下不感知节点边界,可能把 worker 0–15 分配到 node 0 的 CPU 0–15,但 worker 16–31 却落到 node 1 的 CPU 32–47 —— 表面“绑了”,实则跨节点访问内存。必须手动按 node 切分掩码。

