我以前整理过,下面是我的一篇博客上的:
有些网卡的中断没有用到多个cpu,只用到一个CPU,导致那个cpu的软中断是100%,系统缓慢。
[root@web
~]# cat /proc/interrupts
CPU0
CPU1
0:
939474003
0 IO-APIC-edge
timer
1:
7 2
IO-APIC-edge
i8042
6:
2 3
IO-APIC-edge
floppy
7:
0 0
IO-APIC-edge
parport0
8:
1 0
IO-APIC-edge
rtc
9:
0 0
IO-APIC-level
acpi
12:
0 116
IO-APIC-edge i8042
15:
47539568 94428
IO-APIC-edge ide1
51:
4557238 12181 IO-APIC-level
ioc0
59:
0 0
IO-APIC-level vmci
75:
101314205
0 PCI-MSI
eth0
NMI:
0 0
LOC:
998113903 999592029
ERR:
0
MIS:
0
可以看到eth0只用到了cpu0,加外
mpstat -P ALL
1
top中的si
也可以查看cpu中断的使用情况。
解决这个问题,有两个办法:
1)
用irqbalance服务
irqbalance针对多核以及超线程采用共享缓存的系统只处理一次设备中断均衡,也即以静态方式分配各设备中断对应的CPU。在双核及单核系统中启动irqbalance,并不会影响系统资源,因为irqbalance在做完中断均衡相关判断、处理后即退出。
centos上自带了irqbanlance,安装上
chkconfig --level 345 irqbalance on
service irqbalance
start
就行了。
当然这个办法不是最好的办法。irqbalance仅是一个通用方案,而不是最佳方案。
2)
修改内核参数/proc/irq/irq#/smp_affinity
[root@archimedes /proc]# cat
/proc/irq/75/smp_affinity
00000001
表示eth0只用到了第一个cpu,可以修改这个参数,使它使用多个cpu。
参数:
Binary
Hex
CPU 0
0001 1
CPU
1 0010
2
CPU 2
0100 4
CPU
3 1000
8
参数是一个10进制的值,cpu n == 2 的 n
次方。
如果用cpu0和cpu2:
Binary Hex
CPU 0 0001
1
+ CPU 2
0100
4
-----------------------
both
0101
5
全用:
Binary Hex
CPU
0 0001 1
CPU 1 0010
2
CPU 2
0100 4
+ CPU
3 1000
8
-----------------------
both
1111 f
修改:
echo f
> /proc/irq/75/smp_affinity
需要注意的是:
有些网卡在PCI-MSI模式下修改这个参数不起作用,需要在内核启动时加上pci=nomsi参数。网上看主要是Broadcom的网卡有这个问题。
2010-08-09
farmer.luo
发件人: Zhifei ye
发送时间: 2010-08-09 12:57:04
收件人: dev4server
抄送:
主题: 初来乍到,请教个关于linux下多核处理软中断的方案