核心是让每个 Nginx worker 进程稳定运行在固定物理 CPU 核上,避免跨核迁移导致缓存失效、TLB 刷新和上下文切换激增;推荐使用 worker_cpu_affinity auto; 配合 worker_processes auto;,由 Nginx 1.9.10+ 自动识别物理核并跳过超线程,再同步设置 worker_rlimit_nofile 65535;、multi_accept on;、use epoll;,并通过 ps 和 taskset 验证绑定效果。

核心是让每个 Nginx worker 进程稳定运行在固定物理 CPU 核上,避免被内核调度器来回迁移。上下文切换激增往往不是因为连接数多,而是因为 worker 进程频繁跨核运行,导致缓存失效、TLB 刷新、寄存器状态反复保存恢复。
绑定 CPU 亲和性(最关键一步)
直接使用 worker_cpu_affinity auto;,这是当前最稳妥的方案。Nginx 1.9.10+ 已能自动识别物理核心数,跳过超线程逻辑核,避开 NUMA 节点错配风险。不需要手动计算 0001 0010 这类掩码,也无需担心绑错核或重复绑定。
- 搭配 worker_processes auto;,Nginx 自动匹配物理核数量,不盲目设为逻辑 CPU 总数
- 若机器有 8 个物理核,auto 模式会启动 8 个 worker,并分别绑定到 8 个不同物理核
- 禁用额外干扰:不要同时设置 worker_priority 或外挂 sched_setaffinity 脚本
确保 worker 有足够资源干活
光绑定没用,如果进程因资源不足被阻塞或抢占,亲和性就失去意义。
- worker_rlimit_nofile 65535; —— 显式声明单进程文件描述符上限,且该值必须 ≥ worker_connections × worker_processes
- worker_connections 值需与系统级限制对齐:修改 /etc/security/limits.conf 中对应用户的 nofile,并调大 fs.file-max
- 确认 use epoll; 和 multi_accept on; 已启用,提升事件处理效率,减少单次循环中无效唤醒
验证是否真正生效
不能只看配置 reload 成功,要查进程实际运行状态:
- 执行 ps -eo pid,args,psr | grep 'nginx: worker' —— 每个 worker 的 PSR 列应显示不同且稳定的 CPU 编号(如 0、1、2、3),不重复也不跳变
- 执行 taskset -cp $(pgrep -f "nginx: worker" | head -1) —— 输出类似 pid 12345's current affinity list: 0 表示已成功绑定到第 0 号物理核
- 用 vmstat 1 观察 cs(context switch)列:优化后每秒上下文切换应明显下降,理想情况下低于 10 万次
配合系统级调度优化
CPU 绑定效果依赖底层调度环境稳定:
- 确认未启用 intel_idle.max_cstate=1 等深度节能策略,这类设置会导致核心频繁进出低功耗状态,破坏亲和性稳定性
- 如部署在虚拟机中,确保宿主机已关闭 CPU 频率调节(cpupower frequency-set -g performance),并开启 CPU pinning
- 避免其他高优先级实时进程长期霸占同一物理核,可使用 chrt -r 10 类命令临时测试隔离效果


















