Linux内核中断内幕(3)

  从以上描述,我们不难看出整个中断的流程,如图 4 所示:

X86中断流


图 4:X86中断流

  本文作者之一曾经对2.6.10的中断系统进行过情景分析,有兴趣的读者可以和作者取得联系,获取相关资料。

  中断绑定——中断亲和力(IRQ Affinity)

  在 SMP 体系结构中,我们可以通过调用系统调用和一组相关的宏来设置 CPU 亲和力(CPU affinity),将一个或多个进程绑定到一个或多个处理器上运行。中断在这方面也毫不示弱,也具有相同的特性。中断亲和力是指将一个或多个中断源绑定到特定的 CPU 上运行。中断亲和力最初由 Ingo Molnar 设计并实现。

  在 /proc/irq 目录中,对于已经注册中断处理程序的硬件设备,都会在该目录下存在一个以该中断号命名的目录 IRQ# ,IRQ# 目录下有一个 smp_affinity 文件(SMP 体系结构才有该文件),它是一个 CPU 的位掩码,可以用来设置该中断的亲和力, 默认值为 0xffffffff,表明把中断发送到所有的 CPU 上去处理。如果中断控制器不支持 IRQ affinity,不能改变此默认值,同时也不能关闭所有的 CPU 位掩码,即不能设置成 0x0。

  我们以网卡(eth1,中断号 44 )为例,在具有 8 个 CPU 的服务器上来设置网卡中断的亲和力(以下数据出自内核源码 Documentation\IRQ-affinity.txt):

  [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]#

  在上例中,我们首先只允许在 CPU0~3 上处理网卡中断,接着运行 ping 程序,不难发现在 CPU4~7 上并没有对网卡中断进行处理。然后只在 CPU4~7 上对网卡中断进行处理, CPU0~3 不对网卡中断进行任何处理,运行 ping 程序之后,再次查看 /proc/interrupts 文件时,不难发现 CPU4~7 上的中断次数明显增加,而 CPU0~3 上的中断次数没有太大的变化。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpzsx.html