要实现Nginx在隔离CPU上的真正低抖动转发,必须三层协同:一、内核启动参数三要素齐备——isolcpus=2,3(移除CFS调度)、nohz_full=2,3(停周期tick)、rcu_nocbs=2,3(迁出RCU回调);二、手动迁移中断至非隔离核并禁用irqbalance;三、Nginx显式绑定worker_cpu_affinity且禁用干扰服务。

要让 Nginx(或其他转发服务)在隔离 CPU 上跑出真正低抖动、零干扰的非阻塞转发效果,光加 isolcpus 或只做 worker_cpu_affinity 都不够。关键在于三层协同:内核启动级清场、中断与回调迁移、进程级精准入驻。
一、启动参数必须三要素齐备
仅写 isolcpus=2,3 是无效隔离——它只让 CFS 调度器“看不见”这两核,但时钟 tick、RCU 回调、软中断仍会偷偷抢占。必须组合使用:
- isolcpus=2,3:从常规调度队列中移除 CPU 2 和 3
- nohz_full=2,3:关闭周期性 tick,避免定时器中断唤醒
- rcu_nocbs=2,3:把 RCU callbacks 迁出,防止后台回调吃掉 CPU 时间
编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX_DEFAULT 中加入完整参数,例如:
然后执行 sudo update-grub && sudo reboot。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
二、中断必须全部迁离隔离核
即使 CPU 被隔离,网卡、磁盘等设备的硬中断(IRQ)默认仍可能落到隔离核上。需手动重定向:
- 查当前中断分布:
cat /proc/interrupts | grep -E "(IO-APIC|PCI-MSI)" - 对每一行非 0 的 IRQ(如 IRQ 45),确认其 SMP affinity:
cat /proc/irq/45/smp_affinity_list - 将其绑定到非隔离核(如 0,1):
echo 0-1 | sudo tee /proc/irq/45/smp_affinity_list - 更稳妥做法是停用
irqbalance:sudo systemctl stop irqbalance && sudo systemctl disable irqbalance
三、Nginx 必须显式绑定且禁用干扰服务
隔离只是“清空场地”,你得把 Nginx 主动请进去,并堵住所有后门:
- 在
nginx.conf中启用严格绑定:worker_processes 2;+worker_cpu_affinity 0100 1000;(对应 CPU 2 和 3,注意位序从 CPU0 开始) - 禁用 systemd 默认 CPUAffinity(否则会覆盖内核设置):
sudo systemctl edit nginx,填入:
[Service]
CPUAffinity=2 3
CPUSchedulingPolicy=other - 关闭非必要服务:
sudo systemctl stop snapd lxd bluetooth ModemManager等,减少后台线程误入可能
四、验证是否真正“专属”
重启后不能只看参数是否存在,要分层验证:
- 确认隔离生效:
cat /sys/devices/system/cpu/isolated→ 应输出2-3 - 检查中断归零:
cat /proc/interrupts | awk 'NR → CPU2、CPU3 列全为 0 - 观察 worker 实际运行核:
ps -o pid,psr,comm -C nginx→ 所有 worker 的 PSR 列应稳定为 2 或 3 - 压测时用
perf top -C 2,3查看热点,若只有 Nginx 和 syscall,说明无干扰

















