中断绑定及常见中断核心隔离¶
中断绑定是指将中断请求(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核心编号。
验证效果
- 在负载下,反复执行
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三参数结合可解决此问题:
isolcpus:将指定 CPU 从内核通用调度器隔离,阻止多数内核线程和普通进程运行;nohz_full:在隔离核心启用自适应无时钟模式,减少 / 消除时钟中断;rcu_nocbs:将 RCU 回调卸载到非隔离核心。 最终为关键低延迟任务提供近乎独占、无内核干扰的 “静默” 运行环境。