Linux 2010-07-28 19:55:07 阅读45 评论0 字号:大中小 订阅
先看看系统上的中断是怎么分配在 CPU 上的,很显然 CPU0 上处理的中断多一些:
# cat /proc/interrupts CPU0 CPU1 0: 918926335 0 IO-APIC-edge timer 1: 2 0 IO-APIC-edge i8042 8: 0 0 IO-APIC-edge rtc 9: 0 0 IO-APIC-level acpi 12: 4 0 IO-APIC-edge i8042 14: 8248017 0 IO-APIC-edge ide0 50: 194 0 IO-APIC-level ohci_hcd:usb2 58: 31673 0 IO-APIC-level sata_nv 90: 1070374 0 PCI-MSI eth0 233: 10 0 IO-APIC-level ehci_hcd:usb1 NMI: 5077 2032 LOC: 918809969 918809894 ERR: 0 MIS: 0
为了不让 CPU0 很累怎么把部分中断转移到 CPU1 上呢?或者说如何把 eth0 网卡的中断转到 CPU1 上呢?先查看一下 IRQ 90 中断的 smp affinity,看看当前中断是怎么分配在不同 CPU 上的(ffffffff 意味着分配在所有可用 CPU 上):
# cat /proc/irq/90/smp_affinity 7fffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff
在进一步动手之前我们需要先停掉 IRQ 自动调节的服务进程,这样才能手动绑定 IRQ 到不同 CPU,否则自己手动绑定做的更改将会被自动调节进程给覆盖掉。如果想修改 IRQ 90 的中断处理,绑定到第2个 CPU(CPU1):
# /etc/init.d/irqbalance stop # echo "2" > /proc/irq/90/smp_affinity
(上面的 echo “2″ 是怎么来的?为什么是 ”2“?请参考这篇:计算 SMP IRQ Affinity)过段时间在看/proc/interrupts,是不是 90:eth0 在 CPU1 上的中断增加了(145)、在 CPU0 上的中断没变?不断打印 /proc/interrupts 就会发现 eth0 在 CPU0 上的中断数始终保持不变,而在 CPU1 上的中断数是持续增加的,这正是我们想要的结果:
# cat /proc/interrupts CPU0 CPU1 0: 922506515 0 IO-APIC-edge timer 1: 2 0 IO-APIC-edge i8042 8: 0 0 IO-APIC-edge rtc 9: 0 0 IO-APIC-level acpi 12: 4 0 IO-APIC-edge i8042 14: 8280147 0 IO-APIC-edge ide0 50: 194 0 IO-APIC-level ohci_hcd:usb2 58: 31907 0 IO-APIC-level sata_nv 90: 1073399 145 PCI-MSI eth0 233: 10 0 IO-APIC-level ehci_hcd:usb1 NMI: 5093 2043 LOC: 922389696 922389621 ERR: 0 MIS: 0