初来乍到,请教个关于linux下多核处理软中断的方案

109 views
Skip to first unread message

Zhifei ye

unread,
Aug 9, 2010, 12:56:27 AM8/9/10
to dev4s...@googlegroups.com
压力测试时,在每秒访问量上4000左右时,软中断的处理都集中在了CPU的一个核上面,如果想CPU多核处理软中断,改怎么弄呢?

farmer.luo

unread,
Aug 9, 2010, 1:02:53 AM8/9/10
to dev4server
 
我以前整理过,下面是我的一篇博客上的:
 
 
有些网卡的中断没有用到多个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下多核处理软中断的方案
压力测试时,在每秒访问量上4000左右时,软中断的处理都集中在了CPU的一个核上面,如果想CPU多核处理软中断,改怎么弄呢?

--
高性能服务器研发与运营
http://groups.google.com/group/dev4server

poe....@gmail.com

unread,
Aug 17, 2010, 7:23:45 AM8/17/10
to 高性能服务器研发与运营邮件列表
还有一个办法,就是最近发布的2.6.35的内核的RPS ,去试试,很有效果。还有就是硬件方案了。 intel 82576网卡

> irqbalance针对多核以及超线程采用共享缓存的系统只处理一次设备中断均衡,也即以静态方式分配各设备中断对应的CPU。在双核及单核系统中启动irq balance,并不会影响系统资源,因为irqbalance在做完中断均衡相关判断、处理后即退出。

> farmer.luo

Reply all
Reply to author
Forward
0 new messages