CPU的频率之争到目前为止应该暂且告一段落,下一个竞争的目标是什么呢?大家应该有所觉察:多核CPU。可是操作系统和应用程序为多核CPU准备好了么?
这段时间测试一个SMP系统的网络吞吐量,发现大多数情况下只有一个CPU负载较重,另外一个CPU的负载几乎为0,查看他们对中断的响应情况,前者几乎响应了所有的网络中断请求。
因为Linux内核在处理网络数据包的过程中引入了软中断,所以硬中断只是将skb挂在响应此中断的CPU的软中断软网络设备(softnet)上,然后唤醒此CPU的软中断处理例程处理skb,所以响应此中断的CPU要处理所有网络数据包,负载当然很大。
能够在多个CPU之间均衡分配硬件中断,试图达到SMP系统CPU负载均衡的目的,启用此守护进程之后,IRQ的分配确实趋向平衡。仔细考虑,任何一个时间都只是有一个CPU在响应中断,那么IRQBalance所能做到的也无非就是在多个CPU之间均衡负载,这对于提升性能几乎是于事无补的。可实际的测试结果表明,IRQ的均衡确实提高了网络的吞吐量,一定是我漏掉了什么条件。再思之,对于网络包的接收中断是分硬中断和软中断两步处理的,其中硬中断的处理速度较软中断要迅速得多,我上面的考量只是对于硬中断有效,当网络负载比较大的情况下,软网络设备上肯定会积压很多数据包需要处理,而这时如果将数据包通过IRQ的均衡平均分配到多个CPU的软中断设备上,其后续的软中断处理的压力也会均分,网络吞吐量能不增加么?如果网卡的中断过于频繁,致使CPU大部分时间都在响应其硬中断而无暇他顾,此时中断机制相比轮询就是弊大于利了,一些人也许会考虑启用Linux的NAPI,这确实是个不错的主意,实际也能提高性能,不过这点儿提升只是杯水车薪而已,采用SMP系统或者是多核CPU加上IRQBalance才能大幅度提高网络的吞吐量。既然两者都能提升性能,为何不兼用之?这还得从NAPI的原理说起,目前的NAPI实现为:
当网络流量特别大时,网卡将被关联到某个CPU的软中断上下文中,然后关闭其硬件中断,由接收软中断用轮询的方式从网卡取走数据包并处理之。如果SMP系统只有一块网卡流量较大,而它由于NAPI的缘故被关联到某一个CPU,并关闭了硬中断,这个时候发生的情况就合单CPU无异了,SMP系统的优势并没得到充分发挥。所以,在某种情况下两者是鱼和熊掌的关系--不可兼得,具体的取舍还要综合各方面因素具体分析。但是如果网卡首先成为了系统的瓶颈,那么两者也就都不能奏效了,你可以选择购买更高速率的网卡,或者是采用网卡bonding技术。
讨论到这里,基本就可以收场了。可当我读IRQBalance的
文档时发现它所考虑的问题要比我多得多,比如说它的另外一个目的--节省功耗、均衡时的Cache命中率,以及更深层次的系统结构等。
不得不感叹:事物是普遍联系的。
参考资料:
- Linux/Documentation/IRQ-affinity.txt
- NAPI 技术在 Linux 网络驱动上的应用和完善
阅读(5050) | 评论(2) | 转发(0) |