手动配置 worker_cpu_affinity 掩码可提升 nginx 多核吞吐,需确保每个 worker 独占一个逻辑核心,避开超线程争抢、跨 numa 访存和缓存抖动,并配合关闭 accept_mutex、开启 multi_accept、调高连接数及绑定网卡软中断等协同优化。

要让 Nginx 反向代理在多核服务器上跑出更高吞吐,手动配置 worker_cpu_affinity 掩码是有效手段之一,但关键在于“对得准”——不是随便写几个 1 就行,而是让每个 worker 独占一个逻辑核心,避开超线程争抢、跨 NUMA 访存和缓存抖动。
先摸清 CPU 实际拓扑
手动配掩码前必须确认真实可用的逻辑 CPU 列表:
- 运行
lscpu | grep "CPU(s):"查总逻辑核数(比如显示 16,可能是 8 物理核 + 超线程) - 用
cat /sys/devices/system/cpu/online看当前启用范围(如0-15表示 core 0 到 15 都在线) - 检查 BIOS 是否开启超线程;若关闭,逻辑核数 = 物理核数,掩码位宽就按这个数来
- 虚拟机或容器中慎用——需确认宿主机透出完整 topology,否则手动写的掩码可能超出实际可用范围
按核数写对位宽与顺序
掩码组数必须等于 worker_processes 数量,每组二进制位宽 = 逻辑 CPU 总数,最低位(最右)对应 core 0:
- 4 核机器(逻辑核 0–3):设
worker_processes 4,则写worker_cpu_affinity 0001 0010 0100 1000 - 8 核机器(逻辑核 0–7):写
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 - 也可以用十六进制简化:8 核对应
01 02 04 08 10 20 40 80,更紧凑且不易数错位 - 若只想用前 4 个物理核(屏蔽超线程),且系统有 16 逻辑核,可写
worker_cpu_affinity 0000000000001111——但注意:这只能配 1 个 worker,如要多个,得配合auto 00001111或拆成多组短掩码
反代场景下的关键协同项
只绑 CPU 不够,反向代理性能卡点常在连接建立、后端转发和软中断搬运上:
- 关掉
accept_mutex off(Nginx ≥ 1.11.3 默认已关),避免多个 worker 抢 accept 锁串行排队 - 开
multi_accept on,让单个 worker 一次收多个新连接,降低事件循环唤醒频次 -
worker_connections至少设到 10240 或更高,并同步调大系统级限制:ulimit -n 65535和fs.file-max = 2097152 - 把网卡软中断(softirq)也绑到相同核心——比如 worker 绑 core 0–3,就用
echo 1 > /proc/irq/*/smp_affinity_list把对应网卡中断固定到 0–3,避免数据包收发和 worker 处理跨核搬运
验证是否真正生效
改完配置 reload 后,别只信日志,要看进程实际跑在哪:
- 查 worker PID:
ps -eo pid,args,psr | grep 'nginx: worker',第三列psr显示运行在哪个 CPU ID 上 - 看亲和性掩码:
taskset -cp <pid></pid>,输出应显示类似pid xxx's current affinity list: 0(表示只允许在 core 0 运行) - 进
/proc/<pid>/status</pid>检CPUs_allowed_list字段,确保值与你配置的掩码一致 - 如果多个 worker 显示同一 core ID,说明掩码重复或数量不匹配,需回头检查










