线上设备偶尔会出现各cpu softirq消耗不均的情况,有的cpu甚至被softirq打满,成为性能瓶颈。主要原因是网络软中断分布不均,计划用rps & xps 尝试优化。但线上设备配置多样,需要针对不同软硬件配置的机器适配好优化策略,确保不会产生负面影响。这里记录一些遇到的问题。
原理及分析
rps 这一特性早在2.6.38就进入内核,与其相关的rss rfs xps 等技术的原理及实现已有大量资料,这里仅简单梳理一下。
rps 概括来说是通过软件方法模拟多队列处理网络收包,减缓单cpu的压力。其实现原理是在网络收包软中断中,再将收到的包分发给其他cpu继续进行协议处理,从而减轻当前cpu的压力。从rps的实现可以看出,这种软件模拟的网络多队列收包不会增加网卡irq中断的数量,但由于产生了额外的软中断以及IPI中断,系统整体在软中断上的开销会有所增加。实际调试中发现开启rps后,NET_RX软中断几乎翻倍,伴随产生大量IPI中断,整体cpu在softirq上的开销略微上涨。
rfs 是用于优化rps分发包的策略,原理是尽量将一个包分发给接收该包的应用程序所在的cpu来处理,从而提升cache命中率,提高性能。
xps 用于设置发包时选择网卡硬件队列的策略。只对支持硬件多队列的网卡有效,支持两种策略,一种根据当前cpu选择发包队列;另一种根据接受队列选择发包队列。
与irq affinity的关系
对于收包流程,cpu收到网卡中断后进行初步处理,延后唤起自身软中断继续处理网络协议部分,此时若开启了rps,该cpu再将包分发给其他cpu。即处理网卡接收中断的cpu就是负责分发包的cpu。
对于发包流程,网卡发送中断主要负责发送完成后的处理流程。</