Nginx 自动识别多核拓扑需配置 worker_processes auto 和 worker_cpu_affinity auto,前者读取物理核心数(非逻辑线程),后者绑定各 worker 到专属物理核;须配合 lscpu 验证、cgroups v2 支持及 NUMA 优化,并通过 ps 和 /proc/*/status 验证绑定生效。

让 Nginx 自动识别多核处理器拓扑结构,核心在于正确配置全局块中的 worker_processes 和 worker_cpu_affinity,并确保底层系统支持自动探测物理核心数(而非逻辑线程数)。
worker_processes 设为 auto 是前提
在 nginx.conf 全局块中写入:
这是最直接、最可靠的方式。Nginx 1.3.8+ 版本起支持该值,它会读取 /proc/cpuinfo 中的物理核心信息(排除超线程虚拟核),自动匹配服务器真实物理 CPU 核数。例如 4 路 Xeon、每路 16 核(共 64 物理核)的机器,就会启动 64 个 worker 进程。
不建议手动写死数字,尤其在容器或云环境中——宿主机核数可能远高于容器实际配额,容易导致资源争抢或调度失衡。
启用自动 CPU 亲和性绑定
紧接在 worker_processes auto; 后添加:
该指令要求 Nginx ≥ 1.9.10(推荐 ≥ 1.12.0)。它会按顺序将每个 worker 进程一对一绑定到一个物理核心上,位图映射由 Nginx 内部完成,无需手算二进制掩码。效果等同于:
- 避免进程被 Linux 调度器随意迁移
- 提升 L1/L2 缓存命中率
- 减少 TLB 刷新与跨核内存访问延迟
若使用旧版本 Nginx,需手动配置掩码,如 8 核机器写成:
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
配套系统级支持不能少
仅靠 Nginx 配置无法真正“识别拓扑”,还需操作系统配合:
- 确认
lscpu | grep -E "Core|Socket"输出的物理核心总数,与worker_processes auto实际启动数一致 - 检查
/sys/devices/system/cpu/topology/下是否存在core_siblings_list等文件,表明内核已暴露拓扑信息 - 容器环境需确保 cgroups v2 已启用,并挂载
/sys/fs/cgroup;否则 Nginx 可能回退到读取宿主机 cpuinfo - NUMA 架构下,建议配合
numactl --cpunodebind=0 --membind=0 nginx启动,避免跨节点内存访问
验证是否生效
配置完成后重载 Nginx:
nginx -s reload再执行以下命令验证:
-
ps -eo pid,comm,psr | grep nginx | grep -v master—— 查看各 worker 的实际运行 CPU 编号(PSR 列) -
cat /proc/$(pgrep -f "nginx: worker")/status | grep Cpus_allowed_list—— 检查每个 worker 是否只被允许运行在单一核心上 -
nginx -V 2>&1 | grep -o 'built by.*gcc'—— 确认编译时启用了多线程支持


















