直接用 worker_cpu_affinity auto 最稳妥,它自动绑定物理核、避开超线程、适配 NUMA,配合 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) - 避免干扰:不建议再设
worker_priority或外挂sched_setaffinity脚本,Nginx 自身绑定已足够精准
三步验证是否真正生效
reload 配置后,不能只看日志,要实打实查进程状态:
- 查当前运行核:
ps -eo pid,args,psr | grep 'nginx: worker'—— 每个 PID 对应的 PSR 列应是不同数字(如 0、1、2、3),且不重复 - 查亲和性掩码:
taskset -cp $(pgrep -f "nginx: worker" | head -1)—— 显示类似pid 12345's current affinity list: 0表示已成功绑定到第 0 号物理核 - 查全局指标:
vmstat 1观察cs(上下文切换次数/秒),优化后应稳定在 10000 以下,远低于未调优时的数十万级










