worker_cpu_affinity通过绑定worker进程到固定物理核心来减少跨核开销,提升TCP转发稳定性;需配合worker_processes>1、禁用超线程干扰、对齐RSS队列及调优系统参数方可生效。

worker_cpu_affinity 本身不提升“单核”处理效率,而是通过让每个 worker 稳定运行在独立物理核心上,避免跨核迁移带来的缓存抖动、TLB 刷新和上下文切换开销——这对密集型 TCP 转发(如 stream 模块长连接透传、数据库代理、游戏网关)尤为关键。它不是让一个核跑得更快,而是让一个 worker 在固定核上跑得更稳、更可预测。
以下聚焦 TCP 转发场景的实操要点:
明确前提:必须启用多 worker 进程
单个 worker 绑定到单核无意义,因为 worker_cpu_affinity 仅在 worker_processes > 1 时生效。TCP 转发属高 I/O 密集型,建议:
-
worker_processes auto;(Nginx ≥ 1.9.10) - 或显式设为物理核心数(非逻辑核数),例如 8 物理核 →
worker_processes 8;
⚠️ 若 BIOS 启用超线程(HT),16 逻辑 CPU ≠ 16 可用执行单元。TCP 转发对指令吞吐和中断延迟敏感,应优先绑定物理核,避开超线程对争抢。
推荐配置方式:auto + 掩码限域
最稳妥写法(兼顾兼容性与 NUMA 意识):
worker_processes auto; worker_cpu_affinity auto 0000000011111111; # 仅启用前 8 个逻辑 CPU(对应 8 物理核)
-
auto自动按物理核顺序分配(跳过 HT 对中的第二个逻辑核) - 后缀十六进制掩码
0000000011111111(即二进制 8 个 1)限定可用 CPU 集合,防止误用超线程核
若需严格对齐网卡 RSS 队列(强烈推荐):
- 查网卡队列数:
ethtool -l eth0 | grep "Current:" - 假设为 4 队列 → 配
worker_processes 4;+worker_cpu_affinity 0001 0010 0100 1000; - 目的是让每个 worker 与一个 RSS 队列同核,减少软中断与工作进程跨核数据搬运
必须同步调优的配套项
CPU 绑定只是基础,TCP 转发性能还卡在系统层和 Nginx 事件模型:
-
worker_rlimit_nofile 65535;(并确保ulimit -n 65535生效) -
use epoll;(Linux 必选) -
multi_accept on;(单次事件循环尽可能多地 accept 新连接) -
accept_mutex off;(Nginx ≥ 1.11.3 默认关闭,确认未被覆盖) - 关闭无关模块(如
http,perl,xslt),减小 worker 内存占用,释放更多 L3 缓存给 socket 元数据和 TLS 上下文
验证是否真正生效
reload 后立即检查,不能只看配置文件:
- 查运行核分布:
ps -eo pid,args,psr | grep 'nginx: worker' | grep -v grep
→ 每行 PSR 值应互不相同(如 0、1、2、3…),且落在你限定的核范围内 - 查亲和性掩码:
taskset -cp $(pgrep -f "nginx: worker" | head -1)
→ 输出应类似pid 12345's current affinity list: 0 - 查底层允许范围:
cat /proc/$(pgrep -f "nginx: worker" | head -1)/status | grep Cpus_allowed_list
→ 应显示明确数字(如0-3),而非0-15
不复杂但容易忽略。

















