背景:
1)在使用 Xilinx zynq SOC时,发现I2C中断不能得到及时响应,定位发现SPI中断过多引起的.
2)irq 的默认smp_affinity是f, 按照理解中断应该在四个核上动态调整, 但只有CPU0在响应外部中断,其他核不响应中断.
UG1046中如下解释, Linux SMP中断默认都在CPU0在响应;实验发现中断只会在小号核上响应(例如中断绑定在CPU1和CPU2,实际只有CPU1在响应中断,可以查看GIC寄存器)
两种实现中断负载均衡
1)手动
cat /proc/interrupts // 查看中断情况与中断号
echo cpu_mask > /proc/irq/IRQ#/smp_affinity // 十六进制,每个bit对应一个CPU
echo cpu_list > /proc/irq/IRQ#/smp_affinity_list // 十进制
echo cpu_mask > /proc/irq/IRQ#/smp_affinity
echo 1 > /proc/irq/IRQ#/smp_affinity // 设置为CPU0
echo f > /proc/irq/IRQ#/smp_affinity // 设置为CPU0 CPU1 CPU2 CPU3
echo 2,8 > /proc/irq/78/smp_affinity_list // 设置为CPU2和CPU8
echo 0-4 > /proc/irq/78/smp_affinity_list // 设置为CPU0 CPU1 CPU2 CPU3 CPU4
2)irqbalance
原理:通过分析/proc/interrupts中断情况和/proc/stat中断负载情况,然后将中断均匀分配到各个CPU核上.
两种mode
performance mode 时,irqbalance 会将中断尽可能均匀地分发给各个 CPU core,以充分利用 CPU 多核,提升性能.
power-save mode 时,irqbalance 会将中断集中分配给 CPU0,以保证其它空闲 CPU 的睡眠时间,降低能耗.