Linux 多核优化编程技术
1 多核下绑定硬件/进程到不同 CPU
硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大
量硬件中断分配给不同的 CPU (core) 处理显然能很好的平衡性能。现在的服务器上动不动
就是多 CPU 多核、多网卡、多硬盘,如果能让网卡中断独占 1 个 CPU (core)、磁盘 IO
中断独占 1 个 CPU 的话将会大大减轻单一 CPU 的负担、提高整体处理效率。我前天收到
一位网友的邮件提到了 SMP IRQ Affinity,引发了今天的话题。以下操作在 SUN FIre
X2100 M2 服务器+ 64 位版本 CentOS 5.5 + Linux 2.6.18-194.3.1.el5 上执行。
1.1 什么是中断
中文教材上对 “中断” 的定义太生硬了,简单的说就是,每个硬件设备(如:硬盘、网卡
等)都需要和 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)。