nginx 1.9.10+ 原生支持原子操作与 worker_cpu_affinity auto,无需额外编译选项,只需确保平台兼容、编译未禁用相关特性,并在 nginx.conf 中配置 worker_processes auto; worker_cpu_affinity auto; 同时系统未限制 cpu 可见性。

源码编译 Nginx 时开启原子操作和 CPU 亲和力优化,核心不是靠编译参数“打开开关”,而是确保底层支持就绪、运行时配置生效。Nginx 本身在 1.9.10+ 版本已原生支持 worker_cpu_affinity auto 和基于原子指令(如 lock xadd)的无锁计数器,无需额外编译选项启用——但前提是你的平台和构建方式不破坏这些能力。
确认基础架构与编译环境兼容
原子操作依赖 CPU 指令集(如 x86 的 LOCK 前缀、ARM 的 LDREX/STREX),现代主流服务器 CPU 均支持。编译时需注意:
- 使用默认的
gcc或clang即可,无需加-march=native等激进优化(反而可能降低跨平台兼容性) - 避免禁用关键模块:
--without-http_upstream_zone_module会间接影响共享内存区的原子更新,不建议关闭 - 确保未手动定义
NGX_HAVE_ATOMIC_OPS=0或覆盖auto/os/linux中的原子检测逻辑
编译阶段只需保留默认行为
Nginx 源码在 auto/os/linux 和 auto/types/sizeof 中自动探测系统能力,包括:
- 是否支持
__sync_fetch_and_add或 C11atomic_int -
/proc/cpuinfo是否可读,用于后续运行时亲和力判断 - 内核版本是否 ≥ 2.6.22(满足
sched_setaffinity()稳定调用)
只要不显式禁用相关特性,configure 过程中看到类似 checking for atomic operations ... found 和 checking for cpu affinity ... found 即表示已就绪。
真正起效靠运行时配置 + 系统协同
编译只是铺路,关键在 nginx.conf 和系统设置:
- 全局块写两行:
worker_processes auto;和worker_cpu_affinity auto; - 确保系统未通过 cgroup v1/v2 限制容器或进程可见 CPU 数(否则
auto会误判) - 搭配
worker_rlimit_nofile 65535;和内核参数net.core.somaxconn = 65535,否则亲和力再准也卡在连接队列 - 验证是否生效:用
ps -eo pid,psr,comm | grep 'nginx: worker'查每个 worker 是否固定落在不同 PSR 上
NUMA 场景需额外留意
双路服务器或 ARM 多 socket 平台,若未约束,auto 可能跨 NUMA 节点绑定,引发远程内存访问延迟。此时应:
- 先运行
numactl --hardware查清节点分布 - 改用手动掩码并限定单节点,例如仅绑定 node 0 的前 4 核:
worker_cpu_affinity 0001001001001000;(配合numactl --cpunodebind=0 --membind=0 nginx启动)











