必须绑定到物理核而非逻辑核,因超线程下l1/l2缓存和执行单元共享,多worker绑同物理核会争抢资源、加剧抖动;worker_processes auto与worker_cpu_affinity auto可自动识别物理核并一对一绑定,配合multi_accept on、use epoll、sendfile on及文件描述符调优,方能压降上下文切换、提升缓存命中率。

直接用 worker_cpu_affinity auto;,配合 worker_processes auto;,就能让每个 Nginx worker 稳定运行在独立物理核上,从根本上规避跨核迁移带来的上下文切换、TLB 刷新和缓存失效。
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
为什么必须绑定到物理核,而不是逻辑核
超线程(HT)会让一个物理核暴露为两个逻辑 CPU(如 8 物理核 + HT = 16 逻辑核),但 L1/L2 缓存和执行单元是共享的。若把两个 worker 绑在同一个物理核的不同逻辑 ID 上,它们会争抢资源,反而加剧抖动和延迟。实测显示:未绑定时每秒上下文切换常超 50 万次,L1 缓存命中率可能从 95% 骤降至 60%;绑定后,热点数据(如 SSL session cache、共享内存 slab)持续驻留本地缓存,延迟更稳。
怎么配才真正起作用
- worker_processes auto; —— Nginx 自动识别物理核心数(不是逻辑核数),启动对应数量的 worker 进程
- worker_cpu_affinity auto; —— 1.9.10+ 版本支持,自动跳过超线程对称核,按物理核顺序一对一绑定
- 禁用 accept_mutex on;(旧版本需显式写 accept_mutex off;),避免连接接入串行排队
- 开启 multi_accept on;,让每个 worker 一次取多个就绪连接,减少 epoll 唤醒次数
- 显式声明 use epoll;,确保使用高效事件模型
配套资源与 I/O 要同步调优
- worker_rlimit_nofile 65535; —— 单进程文件描述符上限,必须 ≥ worker_connections × worker_processes
- 同步修改 /etc/security/limits.conf:对 nginx 用户设 soft/hard nofile 65535
- 调大内核限制:fs.file-max = 2097152(写入 /etc/sysctl.conf)
- 静态文件服务务必启用 sendfile on;,走内核态零拷贝路径,将上下文切换从 4 次压至 2 次
- 搭配 tcp_nopush on; 和 tcp_nodelay on;,减少小包堆积与延迟发送
验证是否真的绑上了
- ps -eo pid,args,psr | grep 'nginx: worker' —— 第三列 psr 应为连续、不重复的数字(如 0、1、2、3…),且长期稳定不变
- taskset -cp $(pgrep -f "nginx: worker" | head -1) —— 输出中 “current affinity list” 显示单一 CPU 编号,说明已成功锁定
- vmstat 1 观察 cs(context switch)列 —— 优化后理想值应低于 10 万次/秒,显著低于未调优时的 50 万+










