Chinaunix首页 | 论坛 | 博客
  • 博客访问: 569174
  • 博文数量: 70
  • 博客积分: 3736
  • 博客等级: 中校
  • 技术积分: 1728
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-08 09:15
文章分类
文章存档

2014年(1)

2012年(21)

2011年(7)

2010年(28)

2009年(13)

分类: LINUX

2010-07-14 09:24:30

前天我们讨论了如何, 分散和平衡各个中断到不同的 CPU 上以获取更大性能的处理能力。上篇限于篇幅的关系,没有来得及进一步说明 “echo 2 > /proc/irq/90/smp_affinity” 中的 ”2“ 是怎么来的,这其实是个二进制数字,代表 00000010,00000001 代表 CPU0 的话,00000010 就代表 CPU0, “echo 2 > /proc/irq/90/smp_affinity” 的意思就是说把 90 中断绑定到 00000010(CPU1)上。所以各个 CPU 用二进制和十六进制表示就是:

               Binary       Hex
CPU 0 00000001 1
CPU 1 00000010 2
CPU 2 00000100 4
CPU 3 00001000 8

如果我想把 IRQ 绑定到 CPU2 上就是 00000100=4:

# echo "4" > /proc/irq/90/smp_affinity

如果我想把 IRQ 同时平衡到 CPU0 和 CPU2 上就是 00000001+00000100=00000101=5

# echo "5" > /proc/irq/90/smp_affinity

需要注意的是,在手动绑定 IRQ 到 CPU 之前需要先停掉 irqbalance 这个服务,irqbalance 是个服务进程、是用来自动绑定和平衡 IRQ 的:

# /etc/init.d/irqbalance stop

还有一个限制就是,IO-APIC 有两种工作模式:logic 和 physical(但是如何配置工作模式,我还不太清楚,请知道的朋友告知一下,^_^),在 logic 模式下 IO-APIC 可以同时分布同一种 IO 中断到8颗 CPU (core) 上(受到 bitmask 寄存器的限制,因为 bitmask 只有8位长。);在 physical 模式下不能同时分布同一中断到不同 CPU 上,比如,不能让 eth0 中断同时由 CPU0 和 CPU1 处理,这个时候只能定位 eth0 到 CPU0、eth1 到 CPU1,也就是说 eth0 中断不能像 logic 模式那样可以同时由多个 CPU 处理。

阅读(3545) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-08-11 09:51:57

LINUX内核技术手册 :是详尽的内核编译指南。 深入linux内核架构 :刚出,正在看。感觉不错。包括写的质量和翻译质量。内容比较全面。 Linux设备驱动程序:第一个看的内核相关的书。驱动开发在于内核之上一层,但是都是内核空间。有助于了解各个机制的工作原理和基本调用方法。(我不是为了编驱动而看的,就是以上的目的) 深入理解Linux内核:老经典。不多说了。很好的一本书。适合结合深入linux内核架构 一起看互补。

chinaunix网友2010-07-14 09:38:14

在我的机子上 [root@localhost ~]# cat /proc/interrupts |grep eth0 27: 0 79401566 PCI-MSI-edge eth0 网卡eth0在cpu0上没有中断。 [root@localhost ~]# /etc/init.d/irqbalance status irqbalance is stopped irqbalance是停止的,那么smp_affinity就会起作用 [root@localhost ~]# cat /proc/irq/27/smp_affinity 2 eth0绑定到了cpu1 正好验证了本文的说法!