核心是通过worker_cpu_affinity绑定worker进程至固定物理核心,避免跨核迁移导致l1/l2缓存失效;需设worker_processes为物理核心数,禁用超线程干扰,并用perf stat等工具验证cache-miss ratio下降。

减少 Nginx Event Loop 的 CPU 缓存失效率,核心是让每个 worker 进程稳定运行在固定 CPU 核心上,避免跨核迁移导致 L1/L2 缓存失效。这不是靠代码逻辑调整,而是通过操作系统调度约束和进程绑定实现的。
CPU 亲和性绑定(最关键)
worker 进程若被内核动态调度到不同核心,刚加载的 socket 状态、TLS 上下文、连接池元数据等缓存内容会立即失效,每次切换都带来数十纳秒到微秒级延迟。解决方式:
- 启用 worker_cpu_affinity auto(Nginx 1.12+),自动将每个 worker 绑定到独立物理核心
- 手动配置更可控,例如 8 核机器: worker_cpu_affinity 00000001 00000010 … 10000000
- 禁用超线程逻辑核(如 4 物理核 + HT = 8 逻辑核),只启 4 个 worker 并绑定物理核,避免伪共享干扰
限制 worker 数量匹配物理资源
过多 worker 不仅争抢 CPU,还会因共享 LLC(最后一级缓存)引发缓存行冲突。建议:
- worker_processes 设为物理核心数,而非逻辑核数或 auto(auto 在某些虚拟化环境可能误判)
- 确认 top 或 htop 中每个 worker 的 %CPU 和 %WAIT 分布均匀,不出现单核持续 95%+ 而其余空闲的情况
- 用 taskset -cp $(pgrep nginx | head -n1) 验证实际绑定状态,确保没被容器或 systemd 覆盖
减少跨核内存访问开销
即使 CPU 绑定正确,若共享内存结构(如共享内存缓存 zone、accept 锁)未对齐或争用激烈,仍会触发跨核 cache line bouncing。优化点:
- 高并发场景下,accept_mutex off(配合 multi_accept on),避免锁竞争导致 worker 频繁等待唤醒
- proxy_cache 或 limit_conn_zone 等共享内存区域,使用 zone=name:size 显式分配,并确保 size 是 64KB 对齐(减少 false sharing)
- 避免在单机混部多个高吞吐服务(如同时跑 Nginx 和 Redis),防止 LLC 被挤占,间接抬高 Nginx 缓存未命中率
验证缓存效率是否改善
不能只看 CPU 使用率,要观察底层指标:
- 用 perf stat -e cache-misses,cache-references,instructions -p $(pgrep nginx | head -1) 抽样采集,cache-miss ratio 低于 1% 为优
- 对比绑定前后 nginx -s reload 后的 P99 延迟波动幅度,抖动明显收窄说明缓存局部性提升
- 观察 /proc/[pid]/status 中的 ctxt_switches 和 nvcsw(非自愿上下文切换)是否下降,下降即代表调度更稳定、缓存更持久











