Nginx worker进程应绑定至独立物理CPU核心以降低切换损耗。需配置worker_processes auto和worker_cpu_affinity auto,确保资源充足并分层隔离HTTP与TCP/UDP流量,最后通过ps、taskset、vmstat验证绑定效果。

让每个 Nginx worker 进程稳定运行在独立 CPU 核心上,是降低进程切换损耗最直接有效的方式。这不是调几个参数就能糊弄过去的事,关键在于绑定要准、资源要够、验证要实。
固定 worker 到物理核心,避免跨核迁移
Nginx worker 是单线程进程,频繁在不同 CPU 核之间调度,会引发 L1/L2 缓存失效、TLB 刷新和完整上下文切换(每次耗时约 5μs)。实测显示,未绑定时每秒上下文切换常超 50 万次,L1 缓存命中率可能从 95% 骤降至 60%。
- 使用
worker_processes auto;—— 自动识别物理核心数(非逻辑核),避开超线程干扰 - 必须配
worker_cpu_affinity auto;—— Nginx 1.9.10+ 内置智能绑定,自动为每个 worker 分配唯一物理核,比手动写二进制掩码更可靠、适配 NUMA 和超线程架构
确保 worker 有足够资源持续运行
绑定只是前提,若因资源不足被系统抢占或阻塞,亲和性就形同虚设:
-
worker_rlimit_nofile 65535;—— 显式声明单进程文件描述符上限 - 同步修改
/etc/security/limits.conf:对 nginx 用户设soft nofile 65535和hard nofile 65535 - 调大内核限制:
fs.file-max至少设为worker_processes × 65535 × 1.2 - 启用
use epoll;和multi_accept on;,减少事件循环无效唤醒
协议分层与资源隔离(多协议场景)
HTTP 和 TCP/UDP 流量处理逻辑完全不同,混跑会互相拖慢:
- HTTP 请求走
http{}块,TCP/UDP 流量统一收口到stream{}块 - 若需同时承载高并发 HTTP 和长连接 TCP(如数据库代理),可按用途分配 CPU:例如 8 核机器,用
worker_cpu_affinity auto 00001111将前 4 核专供 http,后 4 核留给 stream - stream 模块单独调优:
proxy_timeout 30s;、禁用tcp_nopush和tcp_nodelay(不适用零拷贝路径)
验证是否真正生效,别只看配置
配置重载成功 ≠ 绑定成功:
-
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表示已绑定 -
vmstat 1观察cs(context switch)列,优化后理想值应稳定低于 10 万次/秒
不复杂但容易忽略。











