nginx worker进程应避开系统服务常驻的核心,优先识别systemd、ksoftirqd等占用的cpu(多为core 0–2),再通过worker_cpu_affinity显式绑定到空闲物理核(如core 3–7),并配合systemd服务绑核、关闭smt节能、启动时序控制及ps/taskset/mpstat交叉验证确保隔离有效。

要让 Nginx worker 进程避开操作系统关键服务(如 systemd、ksoftirqd、rcu_preempt、监控 agent 等)所占用的核心,核心思路不是“抢核心”,而是“留出核心”——先识别系统服务常驻的 CPU,再显式把 Nginx worker 绑定到其余空闲物理核上。
确认哪些核心被系统服务长期占用
系统关键服务往往默认绑定在低编号核心(尤其是 core 0),或由内核自动调度但倾向固定运行。需实测定位:
- 运行 top -H -p $(pgrep -f 'systemd|ksoftirqd|rcu') -o %CPU,观察高负载线程的 CPUs 列(或按 1 显示各核负载)
- 查软中断分布:cat /proc/interrupts | grep -E "(eth|nvme|ioat)",再配合 cat /proc/irq/*/smp_affinity_list 看网卡、磁盘中断是否集中在 core 0–1
- 检查 systemd 默认绑核策略:systemctl show --property DefaultCPUAffinity(若返回非空值,说明已限制)
为 Nginx 预留专用核心池
不与系统争抢,而是主动绕开。推荐两种稳妥做法:
-
显式跳过前 N 个核心:例如服务器共 16 逻辑核(8 物理 + HT),确认 core 0–2 被 systemd、监控、软中断长期占用,则只启用 core 3–7(物理核)供 Nginx 使用:
worker_processes 5;
worker_cpu_affinity 0000000000001000 0000000000010000 0000000000100000 0000000001000000 0000000010000000; -
用 auto + 掩码限定范围:更简洁安全,尤其适合物理核数明确的场景。例如只允许 Nginx 使用物理核 3–7(对应逻辑核 6–14,假设 HT 开启):
worker_processes 5;
worker_cpu_affinity auto 0000000011111000;(后缀十六进制掩码表示仅启用 bit 3–7)
配套动作:防止系统服务反向侵入
光绑 Nginx 不够,还要稳住系统侧:
- 将关键系统服务手动绑到保留核心:用 systemctl set-property sshd.service CPUAffinity=0-2 或写 .service 文件中加 CPUAffinity=0 1 2
- 禁用内核自动迁移干扰:echo 0 > /proc/sys/kernel/sched_smt_power_savings(关闭超线程节能模式,避免调度器误判)
- 确保 Nginx 启动早于重负载服务(如数据库),避免启动时被内核挤到碎片化核心
验证是否真正隔离成功
reload 后必须交叉验证,不能只看配置:
- ps -eo pid,args,psr | grep 'nginx: worker' → 检查所有 worker 的 PSR 值是否全部落在你指定的范围内(如全是 3/4/5/6/7)
- taskset -cp $(pgrep -f 'nginx: worker' | head -1) → 输出应显示唯一 CPU ID,且不在 0–2 区间
- mpstat -P ALL 1 | tail -n +4 | awk '$3 > 90 {print $2}' → 若只有 core 0–2 长期 95%+,而 Nginx 所在核稳定在 60–80%,说明隔离有效











