![]()
“echo 2 > /proc/irq/33/smp_affinity” 中的 ”2“ 是怎么来的,这其实是个二进制数字,代表 00000010,00000001 代表 CPU0 的话,00000010 就代表 CPU1, “echo 2 > /proc/irq/33/smp_affinity” 的意思就是说把 33 中断绑定到 00000001(CPU0)上。所以各个 CPU 用二进制和十六进制表示就是:
也就是说,Linux绑定CPU是通过掩码表示的,每个CPU对应1位,0表示关闭,1表示开启。
如果想把 IRQ 绑定到 CPU2 上就是 00000100=4:
echo "1" > /proc/irq/33/smp_affinity
如果想把 IRQ 同时平衡到 CPU0 和 CPU2 上就是 00000001+00000100=00000101=5:
echo "5" > /proc/irq/33/smp_affinity
注意,在手动绑定 IRQ 到 CPU 之前需要先停掉 irqbalance 这个服务,irqbalance 是个服务进程、是用来自动绑定和平衡 IRQ 的.
还有一个限制就是,IO-APIC 有两种工作模式:logic 和 physical。