使用 worker_cpu_affinity auto 是最稳妥方案,它自动绑定 Nginx worker 到物理核心,减少上下文切换、提升缓存命中率,配合 worker_processes auto 等参数可显著优化高并发反向代理性能。

直接用 worker_cpu_affinity auto 就行,这是当前最稳妥、适配性最强的方案,尤其适合反向代理这类 I/O 密集又偶有 CPU 热点的高并发场景。
为什么绑定能压降上下文切换
Nginx worker 进程本身轻量,但高频处理 SSL 握手、header 解析、gzip 压缩、连接复用等操作时,Linux 默认调度器容易将其在不同核心间来回迁移。每次迁移都会触发完整进程上下文切换:寄存器状态保存/恢复、TLB 刷新、L1/L2 缓存失效。实测中,未绑定时每秒上下文切换(cs)常超 50 万次,L1 缓存命中率可能从 95% 骤降至 60%,延迟抖动明显增大。
绑定后,每个 worker 固定运行在单一物理核上,热点数据(如 SSL session cache、共享内存 slab)持续驻留本地缓存,避免跨核迁移开销。对长连接、HTTPS 高频请求尤为有效。
auto 模式比手动掩码更可靠
从 Nginx 1.9.10 起,worker_cpu_affinity auto 已足够智能:
- 自动识别物理核心数,跳过超线程逻辑核(例如 16 逻辑 CPU 的机器,默认只用前 8 个物理核)
- 无需手动计算二进制或十六进制掩码,杜绝位数错、重复绑核、NUMA 节点错配等常见错误
- 支持限定范围:如只用前 4 核,可写 worker_cpu_affinity auto 00001111(后缀十六进制掩码限定可用 CPU 集合)
- 仅在 NUMA 架构下需强制绑定某节点内核时,才考虑手动写 0001 0010 0100 1000 类掩码
必须同步调优的配套参数
CPU 绑定效果要真正释放,worker 得有足够资源干活,否则再好的亲和性也白搭:
- worker_processes auto; —— 让 Nginx 自动匹配物理核数,不盲目设为逻辑 CPU 总数
- worker_connections 10240; 或更高,配合 use epoll; 和 multi_accept on;
- worker_rlimit_nofile 65535; —— 并确保系统级 ulimit -n ≥ 该值(修改 /etc/security/limits.conf 和 sysctl fs.file-max)
- 关闭 accept_mutex(1.11.3+ 默认已关),否则 worker 仍会争抢 accept 锁
- 高并发建议开启 reuseport:让内核在 socket 层分发连接,彻底绕过用户态锁
验证是否真的绑上了
别只看配置文件,运行起来再确认:
- 查各 worker 当前运行在哪颗核:ps -eo pid,args,psr | grep 'nginx: worker' —— 第三列(psr)应是 0、1、2、3…一一对应
- 查某进程允许跑的 CPU 列表:taskset -cp
—— 输出类似 pid 12345's current affinity list: 2 表示只允许在 CPU 2 运行 - 压测时观察 mpstat -P ALL 1:各核利用率应相对均衡,没有某核长期 100% 其他核空闲的情况










