启用worker_cpu_affinity可将每个nginx worker进程绑定至固定cpu核心,减少因进程迁移导致的l1/l2缓存失效与tlb刷新,显著提升高并发静态服务的缓存命中率和响应稳定性;需配合worker_processes匹配物理核心数、禁用accept_mutex、启用multi_accept及reuseport,并通过ps、taskset等命令验证绑定效果。

直接用 worker_cpu_affinity 把每个 Nginx worker 绑定到固定 CPU 核心,能显著减少静态服务中的缓存失效。核心逻辑是:避免进程在不同核之间来回迁移,让热点数据(比如文件元信息、SSL 会话、共享内存里的缓存索引)稳定留在对应核心的 L1/L2 缓存里,不被反复清空。
为什么绑定能减少缓存失效
CPU 缓存是按核心组织的。Nginx worker 如果被内核调度器频繁迁移到其他核心,刚加载进缓存的热数据就会被踢出,下次再访问就得重新加载——这叫 Cache Thrashing。尤其在高频静态分发场景(如 CDN 边缘节点、小图/JS/CSS 大量请求),一次迁移可能带来数万次无效缓存行填充和 TLB 刷新,延迟明显上升。绑定后,进程长期驻留,缓存命中率自然提升。
怎么配才真正起作用
-
worker_processes 要匹配物理核心数:比如服务器有 4 物理核(8 逻辑核),优先设
worker_processes 4,而不是 8;超线程不是万能的,绑两个 worker 到同一物理核的两个逻辑核上,反而会争抢缓存和执行单元 -
掩码要一一对应、不重复:4 核就写 4 组二进制掩码,如
0001 0010 0100 1000,每组最低位代表 core 0;不能写成0001 0001,否则两个 worker 都挤在 core 0 上 -
推荐用 auto 模式(Nginx ≥ 1.9.10):写
worker_processes auto;和worker_cpu_affinity auto;,Nginx 会自动按物理核分配,省去手动算掩码的麻烦,且更适配 NUMA 架构
光绑核还不够,还得关掉串行瓶颈
只配 worker_cpu_affinity 效果有限。必须同步调整调度行为:
-
关闭 accept_mutex:Nginx 1.11.3+ 默认已关,旧版本务必显式加
accept_mutex off;,否则所有 worker 还是排队抢 accept 锁,绑再牢也白搭 -
开启 multi_accept:加
multi_accept on;,让单个 worker 一次处理多个就绪连接,减少 epoll 唤醒次数,把绑定核心真正“喂饱” -
搭配 reuseport(Linux ≥ 3.9):在 listen 指令后加
reuseport,让内核在 socket 层就把连接均匀分发到各 worker,彻底绕过用户态锁竞争
验证是否真的绑住了
别只信配置文件,得看实际运行效果:
- 查主进程 PID:
pgrep nginx | head -1 - 看 worker 线程绑在哪:
ps -mo pid,tid,psr,comm -p $(pgrep nginx),PSR 列显示的 CPU 号应稳定不变 - 用 taskset 确认:
taskset -cp $(pgrep nginx | sed -n '2p')(取第一个 worker 的 PID) - 检查 /proc/pid/status 中的
Cpus_allowed_list字段,应只含一个数字










