有些网卡的中断没有用到多个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,加外top中的si,和下面命令也可以查看cpu中断的使用情况。
解决这个问题,有两个办法:
1) 用irqbalance服务
irqbalance针对多核以及超线程采用共享缓存的系统只处理一次设备中断均衡,也即以静态方式分配各设备中断对应的cpu。在双核及单核系统中启动irqbalance,并不会影响系统资源,因为irqbalance在做完中断均衡相关判断、处理后即退出。
asianux上自带了irqbanlance,安装上就行了。
chkconfig --level 345 irqbalance on
service irqbalance start |
当然这个办法不是最好的办法。irqbalance仅是一个通用方案,而不是最佳方案。
2) 修改内核参数/proc/irq/$num/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的网卡有这个问题。
转自:http://hi.baidu.com/farmerluo/blog/item/0a070a7bf7ba5bf90bd18736.html
阅读(2629) | 评论(0) | 转发(2) |