Linux 多核下绑定硬件中断到不同 CPU(IRQ
Anity)
硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件
中断分配给不同的 CPU (core) 处理显然能很好的平衡性能。现在的服务器上动不动就是多
CPU 多核、多网卡、多硬盘,如果能让网卡中断独占 1 个 CPU (core)、磁盘 IO 中断独占 1
个 CPU 的话将会大大减轻单一 CPU 的负担、提高整体处理效率。VPSee 前天收到一位网友
的邮件提到了 SMP IRQ Anity,引发了今天的话题:D,以下操作在 SUN FIre X2100 M2
服务器+ 64 位版本 CentOS 5.5 + Linux 2.6.18-194.3.1.el5 上执行。
什么是中断
中文教材上对 “中断” 的定义太生硬了,简单的说就是,每个硬件设备(如:硬盘、网卡等)都
需要和 CPU 有某种形式的通信以便 CPU 及时知道发生了什么事情,这样 CPU 可能就会放下
手中的事情去处理应急事件,硬件设备主动打扰 CPU 的现象就可称为硬件中断,就像你正在
工作的时候受到 QQ 干扰一样,一次 QQ 摇头就可以被称为中断。
中断是一种比较好的 CPU 和硬件沟通的方式,还有一种方式叫做轮询(polling),就是让
CPU 定时对硬件状态进行查询然后做相应处理,就好像你每隔 5 分钟去检查一下 QQ 看看有
没有人找你一样,这种方式是不是很浪费你(CPU)的时间?所以中断是硬件主动的方式,比
轮询(CPU 主动)更有效一些。
好了,这里又有了一个问题,每个硬件设备都中断,那么如何区分不同硬件呢?不同设备同时
中断如何知道哪个中断是来自硬盘、哪个来自网卡呢?这个很容易,不是每个 QQ 号码都不相
同吗?同样的,系统上的每个硬件设备都会被分配一个 IRQ 号,通过这个唯一的 IRQ 号就能
区别张三和李四了。
在计算机里,中断是一种电信号,由硬件产生,并直接送到中断控制器(如 8259A)上,然后
再由中断控制器向 CPU 发送信号,CPU 检测到该信号后,就中断当前的工作转而去处理中断。
然后,处理器会通知操作系统已经产生中断,这样操作系统就会对这个中断进行适当的处理。
现在来看一下中断控制器,常见的中断控制器有两种:可编程中断控制器 8259A 和高级可编
程中断控制器(APIC),中断控制器应该在大学的硬件接口和计算机体系结构的相关课程中都
学过。传统的 8259A 只适合单 CPU 的情况,现在都是多 CPU 多核的 SMP 体系,所以为了
充分利用 SMP 体系结构、把中断传递给系统上的每个 CPU 以便更好实现并行和提高性能,
Intel 引入了高级可编程中断控制器(APIC)。
光有高级可编程中断控制器的硬件支持还不够,Linux 内核还必须能利用到这些硬件特质,所
以只有 kernel 2.4 以后的版本才支持把不同的硬件中断请求(IRQs)分配到特定的 CPU 上,