跳转至

中断绑定及常见中断核心隔离

中断绑定是指将中断请求(IRQ)分配到特定的CPU核心上处理,避免中断处理对关键路径的干扰。通过合理地绑定中断,可以减少关键路径上的CPU负载,确保确定性延迟。

识别瓶颈: 在调优前,先使用 top, htop, mpstat -P ALL 1 等工具,观察 si (softirq) 或 %irq 是否在某个CPU核心上过高,确认中断处理是瓶颈。

  • 查找设备的 IRQ 号:cat /proc/interrupts
  • 通过最后一列的设备名 (如 eth0-rx-0) 找到对应的IRQ号。
  • 执行绑定的核心文件: /proc/irq/<IRQ号>/smp_affinity_list (推荐) 或 smp_affinity (位掩码)。
  • smp_affinity_list(CPU 列表):直接写入CPU核心编号。
# 示例:将IRQ 128绑定到CPU核心2
sudo sh -c 'echo 2 > /proc/irq/128/smp_affinity_list'

验证效果

  • 在负载下,反复执行 cat /proc/interrupts,观察中断计数是否只在绑定的CPU上增长。
  • 使用 mpstat -P ALL 1 观察各CPU的 %irq 使用率。

遵循NUMA原则: 始终将设备中断绑定到与设备物理位置(PCIe插槽)在同一个NUMA节点的CPU上。

分发负载: 对于多队列设备(如网卡),将每个队列的IRQ均匀地分发到不同的CPU核心上。

irqbalance:自动管理中断的负载均衡,通过配置文件/etc/irqbalance.conf来调整其行为,这个会覆盖上面的精细手动控制的行为。

使用场景:对于关键路径所在的CPU核心,将无关的中断请求绑定到其他核心上,减少该核心的中断处理负担。

在CPU 绑定后,内核线程(如 ksoftirqd、kworker)仍可能抢占绑定核心的用户态线程,时钟中断、RCU 回调也会产生开销;而isolcpus、nohz_full、rcu_nocbs三参数结合可解决此问题:

  1. isolcpus:将指定 CPU 从内核通用调度器隔离,阻止多数内核线程和普通进程运行;
  2. nohz_full:在隔离核心启用自适应无时钟模式,减少 / 消除时钟中断;
  3. rcu_nocbs:将 RCU 回调卸载到非隔离核心。 最终为关键低延迟任务提供近乎独占、无内核干扰的 “静默” 运行环境。
# 修改GRUB配置
grub_cmdline="isolcpus=8-15 nohz_full=8-15 rcu_nocbs=8-15"

# 生效配置
grub2-mkconfig -o /boot/grub2/grub.cfg