+ -
当前位置:首页 → 问答吧 → 关于LINUX上中断在各个CPU之间的负载平衡问题

关于LINUX上中断在各个CPU之间的负载平衡问题

时间:2007-06-29

来源:互联网

关于LINUX上中断在各个CPU之间的负载平衡问题

看帖子
http://linux.chinaunix.net/bbs/thread-753474-1-1.html

说4个CPU有严重的不平衡问题。因为无条件实验,
LZ也不在回贴。所以请有兴趣的来参加实验和讨论。

作者: 思一克   发布时间: 2007-06-29

kernel启动参数加上acpi_irq_balance会不会好? 我试验下先,默认是不balance

作者: albcamus   发布时间: 2007-06-29

好。我想应该问题在于KERNEL而不是NAT(iptables). 所以发这里了

作者: 思一克   发布时间: 2007-06-29



QUOTE:
原帖由 思一克 于 2007-6-29 11:19 发表于 3楼  
好。我想应该问题在于KERNEL而不是NAT(iptables). 所以发这里了



没用。

[root@localhost 21]# cat /proc/cmdline
ro root=LABEL=/ vga=0x31B acpi_irq_balance

[root@localhost 21]# grep eth0 /proc/interrupts
21:      19341          0   IO-APIC-fasteoi   libata, eth0

eth0和libata中断还是全送到了CPU 0, CPU 1一个也没收到。  我机器上是Pentium D双核CPU。



[root@localhost 21]# cat /proc/irq/21/smp_affinity
00000003
这个值是我写入的, 两颗cpu的bitmap位都被置1以允许21号中断, 但还是只送到cpu 0

作者: albcamus   发布时间: 2007-06-29

你cat /proc/interrupts的结果是什么?

作者: 思一克   发布时间: 2007-06-29



QUOTE:
原帖由 思一克 于 2007-6-29 11:27 发表于 5楼  
你cat /proc/interrupts的结果是什么?



[root@localhost Documentation]# cat /proc/interrupts
           CPU0       CPU1
  0:        358          0   IO-APIC-edge      timer
  1:          2          0   IO-APIC-edge      i8042
  8:       8099          0   IO-APIC-edge      rtc
  9:          0          0   IO-APIC-fasteoi   acpi
12:          4          0   IO-APIC-edge      i8042
14:         33          0   IO-APIC-edge      ide0
16:      88855          0   IO-APIC-fasteoi   HDA Intel, fglrx
17:      22918          0   IO-APIC-fasteoi   uhci_hcd:usb1, ehci_hcd:usb5
18:          0          0   IO-APIC-fasteoi   uhci_hcd:usb2
19:          0          0   IO-APIC-fasteoi   uhci_hcd:usb3, Ensoniq AudioPCI
20:          0          0   IO-APIC-fasteoi   uhci_hcd:usb4
21:      32170          0   IO-APIC-fasteoi   libata, eth0
NMI:          0          0
LOC:     234999     203989
ERR:          0
MIS:          0



贫富悬殊很严重啊

作者: albcamus   发布时间: 2007-06-29



QUOTE:
原帖由 思一克 于 2007-6-29 11:04 发表于 1楼  
关于LINUX上中断在各个CPU之间的负载平衡问题

看帖子
http://linux.chinaunix.net/bbs/thread-753474-1-1.html

说4个CPU有严重的不平衡问题。因为无条件实验,
LZ也不在回贴。所以请有兴趣的来参加实验 ...


??我觉得是正常的啊,linux默认是将网卡给一个cpu的own的啊,所以你所有的网卡中断都会发给那个CPU。
要改也很容易的,只要修改APIC的RT表就行了。我不太清楚linux提供的接口函数是什么,但apic.c文件或许展现出一些线索。

作者: zx_wing   发布时间: 2007-06-29

Documentation/IRQ-affinity.txt



QUOTE:
SMP IRQ affinity, started by Ingo Molnar <[email protected]>


/proc/irq/IRQ#/smp_affinity specifies which target CPUs are permitted
for a given IRQ source. It's a bitmask of allowed CPUs. It's not allowed
to turn off all CPUs, and if an IRQ controller does not support IRQ
affinity then the value will not change from the default 0xffffffff.

Here is an example of restricting IRQ44 (eth1) to CPU0-3 then restricting
the IRQ to CPU4-7 (this is an 8-CPU SMP box):

[root@moon 44]# cat smp_affinity
ffffffff
[root@moon 44]# echo 0f > smp_affinity
[root@moon 44]# cat smp_affinity
0000000f
[root@moon 44]# ping -f h
PING hell (195.4.7.3): 56 data bytes
...
--- hell ping statistics ---
6029 packets transmitted, 6027 packets received, 0% packet loss
round-trip min/avg/max = 0.1/0.1/0.4 ms
[root@moon 44]# cat /proc/interrupts | grep 44:
44:          0       1785       1785       1783       1783          1
1          0   IO-APIC-level  eth1
[root@moon 44]# echo f0 > smp_affinity
[root@moon 44]# ping -f h
PING hell (195.4.7.3): 56 data bytes
..
--- hell ping statistics ---
2779 packets transmitted, 2777 packets received, 0% packet loss
round-trip min/avg/max = 0.1/0.5/585.4 ms
[root@moon 44]# cat /proc/interrupts | grep 44:
44:       1068       1785       1785       1784       1784       1069       1070       1069   IO-APIC-level  eth1
[root@moon 44]#




他说的这种情况在我机器上完全无效, 无论如何设置smp_affinity, 还是都送到了cpu 0

作者: albcamus   发布时间: 2007-06-29



QUOTE:
原帖由 zx_wing 于 2007-6-29 11:38 发表于 7楼  

只要修改APIC的RT表就行了




是ioapic的irq route table吧?  看了/proc下没有, /sys/devices/system/下有ioapic、lapic和irqrouter目录, 但进去只有空目录

猜测改写/proc/irq/<number>/smp_affinity文件,就是影响ioapic的RT表的──但不知为何,我机器上不好使

[ 本帖最后由 albcamus 于 2007-6-29 11:46 编辑 ]

作者: albcamus   发布时间: 2007-06-29



QUOTE:
原帖由 albcamus 于 2007-6-29 11:42 发表于 9楼  



是ioapic的irq route table吧?  看了/proc下没有, /sys/devices/system/下有ioapic、lapic和irqrouter目录, 但进去只有空目录

猜测改写/proc/irq/<number>/smp_affinity文件,就是影响ioapic ...


是这个表。我不清楚在linux下有什么接口可以改它,但既然在/sys有,那就应该有相应的driver。
不太清楚linux里这部分,只能提供一点线索

作者: zx_wing   发布时间: 2007-06-29

看来真是个问题拉?

作者: 思一克   发布时间: 2007-06-29

好问题,确实!
密切关注!

作者: augustusqing   发布时间: 2007-06-29



QUOTE:
原帖由 zx_wing 于 2007-6-29 11:49 发表于 10楼  

是这个表。我不清楚在linux下有什么接口可以改它,但既然在/sys有,那就应该有相应的driver。
不太清楚linux里这部分,只能提供一点线索



已经很感谢了  我在看io_apic.c里的内容, 看看能不找到问题所在

作者: albcamus   发布时间: 2007-06-29

看看这篇线索文章,然后达人解释一下吧.

http://www.ibm.com/developerwork ... ernelint/index.html

我想在测试中还应该有一个叫做irqbalance东西吧.

[ 本帖最后由 wysilly 于 2007-6-29 13:22 编辑 ]

作者: wysilly   发布时间: 2007-06-29

我引用的帖子的问题是,iptables重新启动后是平衡的,过了几个小时就严重不平衡了。




QUOTE:
原帖由 wysilly 于 2007-6-29 13:20 发表于 14楼  
看看这篇线索文章,然后达人解释一下吧.

http://www.ibm.com/developerwork ... ernelint/index.html

我想在测试中还应该有一个叫做irqbalance东西吧.

作者: 思一克   发布时间: 2007-06-29

对啊,对啊。就是这个问题,与中断密切相关,要想了解为什么不平衡,不就要了解平衡原理吗?

双网卡,双cpu,刚好一个cpu管一个nic。

双网卡,4cpu好像不太好平衡。所以就又要看irqbalance的实现方式了。

作者: wysilly   发布时间: 2007-06-29

好象不是一个CPU管一个网卡。

你看:2个网卡2个CPU,eth1没有接网线,eth0基本上还是平衡的。


]# cat /proc/interrupts
           CPU0       CPU1
  0: 1218847937         40    IO-APIC-edge  timer
  2:          0          0          XT-PIC  cascade
  8:          0          1    IO-APIC-edge  rtc
14:         66          1    IO-APIC-edge  ide0
16:          0          0   IO-APIC-level  uhci_hcd
18:          0          0   IO-APIC-level  uhci_hcd
19:          0          0   IO-APIC-level  uhci_hcd
23:         13          1   IO-APIC-level  ehci_hcd
26:    9935950          1   IO-APIC-level  ioc0
48:   12783533   46127059   IO-APIC-level  eth0
49:    4903874          1   IO-APIC-level  eth1
NMI:          0          0
LOC: 1065696911 1065696910
ERR:          0
MIS:          0







QUOTE:
原帖由 wysilly 于 2007-6-29 13:29 发表于 16楼  
对啊,对啊。就是这个问题,与中断密切相关,要想了解为什么不平衡,不就要了解平衡原理吗?

双网卡,双cpu,刚好一个cpu管一个nic。

双网卡,4cpu好像不太好平衡。所以就又要看irqbalance的实现方式了。

作者: 思一克   发布时间: 2007-06-29

我是说可以一个cpu绑一个nic,如以下。
           CPU0       CPU1      
169:  645187653          0   IO-APIC-level  eth1
177:       1186   34171661   IO-APIC-level  eth2
225: 3552116787 3976669860   IO-APIC-level  uhci_hcd:usb4, eth0
3个网卡,2cpu,我就让eth0由irqbalance来自动平衡.
eth1绑在cpu0上, cpu1绑eth2,这样效率高,irqbalance来自动平衡,效率差点。

作者: wysilly   发布时间: 2007-06-29



QUOTE:
原帖由 思一克 于 2007-6-29 11:04 发表于 1楼  
关于LINUX上中断在各个CPU之间的负载平衡问题

看帖子
http://linux.chinaunix.net/bbs/thread-753474-1-1.html

说4个CPU有严重的不平衡问题。因为无条件实验,
LZ也不在回贴。所以请有兴趣的来参加实验 ...




在SMP多处理机上是负载不平衡是比较普遍的一种现象, 我也遇到了. 而且也想了一些办法, 不过还是没有成功.

我以前也发过这样的贴子. 当时我的分析如下:

其实irq_balance()虽然可以平衡多个CPU上面的中断数量,但是它仍然不能完全解决CPU负载不平衡的一些问题.
我分析了一下原因,因为中断是发向了一个CPU,而网络中断的下半部是仍软中断来实现的,而软中断会有CPU亲合的问题,就是说你在哪个CPU上触发了这个网卡硬中断,那么这个CPU也会去执行这个硬中断后来的软中断,所以说如果我的网络是1000M的环境的话,那么我的那个触发中断的CPU就会非常繁忙,而另外一个CPU就不会那么繁忙,就会出现了负载不平衡的问题.
而irq_balance()只能是平衡CPU上面的中断的数量,而并不能平衡CPU的负载情况.
而进程的load_balance()也不能很好地解决这个问题,因为软中断是一个进程,load_balance()是将繁忙的CPU上面的进程拉到当前的CPU上面来执行. 但它是不能将正在执行的软中断的进程给拉过来的.

不过后来没有做这方面的内容了. 所以也就没有怎么关心. 不过有一篇论文是关于这个方面的. 虽然比较老了, 但是也许还是有用.
贡献出来, 希望能对大家有一点帮助.

Linux SMP网络体系性能分析.pdf (263.79 KB)

下载次数:700

2007-06-29 18:54

Linux SMP网络体系性能分析

作者: scutan   发布时间: 2007-06-29



QUOTE:
原帖由 albcamus 于 2007-6-29 11:24 发表于 4楼  


没用。

# cat /proc/cmdline
ro root=LABEL=/ vga=0x31B acpi_irq_balance

# grep eth0 /proc/interrupts
21:      19341          0   IO-APIC-fasteoi   libata, eth0

eth0和libata中断还是全 ...




我也是像您这样写过的, 不过写了之后过不了一会儿时间又回到了以前的状态.
当时把我郁闷得...

作者: scutan   发布时间: 2007-06-29

首先,运行irqbalance, 确保CPU中断的分配基本平衡(cat /proc/interrupts可看),然后再研究LOAD的平衡问题.

作者: 思一克   发布时间: 2007-06-29



QUOTE:
原帖由 思一克 于 2007-6-29 19:33 发表于 21楼  
首先,运行irqbalance, 确保CPU中断的分配基本平衡(cat /proc/interrupts可看),然后再研究LOAD的平衡问题.




我是手动将/proc/irq/<ID>/smp_affinity中的值改为全1, 之后还是不行.
而且发现这个/proc/irq/目录下面的smp_affinity中的值除了几个中断号之后,其它的全都是只有一位为1. 其余位全为0.




QUOTE:
           CPU0            CPU1            CPU2         CPU3          CPU4          CPU5          CPU6          CPU7
  0:   23432940   23447916   23446701   23445441   23445463   23445286   23445460   23445256    IO-APIC-edge  timer
  8:          0                0                     1               0                 0                0                1                  1           IO-APIC-edge  rtc
  9:          0                0                     0               0                 0                0                 0                 0           IO-APIC-level  acpi
14:          0               0                     0               0                 0                0                 0                 0           IO-APIC-edge  libata
15:         18         3358877             19         839610       839918           21              24           1679740    IO-APIC-edge  ide1
98:         15              18                   21            11                5               15               15                18         IO-APIC-level  uhci_hcd:usb1, uhci_hcd:usb3, ehci_hcd:usb5
106:          0               0                     0               0                  0                0                 0                 0           IO-APIC-level  uhci_hcd:usb2, uhci_hcd:usb4
122:    2573686          0                      0               0                0                0                 0                 0               PCI-MSI  eth1
177:       3662      50581                 1355        58219         45692           1435          1328          24886       IO-APIC-level  aacraid
NMI:          0                 0                    0                  0              0                0                 0                 0
LOC:  187551733  187551731  187555704  187555703  187554928  187554927  187555782  187555658
ERR:          0
MIS:          0



而此时每个CPU上面的ksoftirqd的这个线程都运行着的. 但是对于某些中断, 仍然是不能很好地进行平均分配.

作者: scutan   发布时间: 2007-06-29

那你的/proc/interrupts看,也不是平衡的?
看你内核中变量irqbalance_disabled的值是什么,是0吗?




QUOTE:
原帖由 scutan 于 2007-6-29 19:52 发表于 22楼  



我是手动将/proc/irq/<ID>/smp_affinity中的值改为全1, 之后还是不行.
而且发现这个/proc/irq/目录下面的smp_affinity中的值除了几个中断号之后,其它的全都是只有一位为1. 其余位全为0.



...

作者: 思一克   发布时间: 2007-06-29

还有,physical_balance 的数值是什么?

可gdb /boot/vmlinux    /proc/kcore
print 出内核变量看。

作者: 思一克   发布时间: 2007-06-29



QUOTE:
原帖由 思一克 于 2007-6-29 21:19 发表于 24楼  
还有,physical_balance 的数值是什么?

可gdb /boot/vmlinux    /proc/kcore
print 出内核变量看。




我gdb /boot/vmlinux中
print physical_balance 出现了下面的语句, 仿佛是没有这个变量. 另外一个变量也是同样的. 望指教.
No symbol table is loaded.  Use the "file" command.

作者: scutan   发布时间: 2007-06-30

高人……学习了

作者: shdnzwy   发布时间: 2007-06-30

to albcamus,

你的IRQ(NIC)平衡问题实验有效果?

作者: 思一克   发布时间: 2007-07-02



QUOTE:
原帖由 wysilly 于 2007-6-29 13:44 发表于 18楼  
我是说可以一个cpu绑一个nic,如以下。
           CPU0       CPU1      
169:  645187653          0   IO-APIC-level  eth1
177:       1186   34171661   IO-APIC-level  eth2
225: 3552116787 397666 ...




如何实现  一个 cpu 绑一个 nic 呢  请问

66: 3274166999          0          0          0         PCI-MSI  eth0
74: 3156380137          0          0          0         PCI-MSI  eth1

uname
Linux cn-pek1-gateway 2.6.18 #1 SMP Fri Jan 5 18:55:35 CST 2007 i686 i686 i386 GNU/Linux

作者: 5iwww   发布时间: 2007-07-02

初步结论:

SMP机器无法将网络程序在内核的负荷在任何时刻都平均分配到多个CPU上。

最好的情况就是将一个NIC绑定到一个CPU。如果CPU个数大于NIC,其余的2个CPU将空闲。

作者: 思一克   发布时间: 2007-07-11

进展实验:

我在LINUX 2。13 SMP已经做好了将一块网卡的IRQ在2个CPU之间平衡切换,多个CPU也一样,找最少的那个使用。多个网卡也应该可以。

改动的是文件arch/i386/kernel/io_apic.c.

不用用户空间的irqbalance,
实际上, 如果你有2个NIC, 2个CPU,现有程序也可以分担到2个CPU,不过切换周期很长。

虽然可以分配,但是
网络负载无法直接利用SMP。同一个时刻, 一个NIC中断还是在一个CPU运行。但SMP还是应该快,因为另一个NIC现在没有使用的CPU可以负责用户程序。间接地提高了速度。

我实验好了后会将对io_apic.c的改动贴出来。

作者: 思一克   发布时间: 2007-07-12

热门下载

更多