当多个线程或进程同时并发读取/proc/cpuinfo
文件时,系统会向各个CPU核心发送IPI(Inter-Processor Interrupt),以获取频率相关的最新数据,这将触发大量等待的IPI,形成了IPI Storm
(IPI风暴),从而降低了系统性能和响应速度。针对该问题,阿里云对x86架构下的Alibaba Cloud Linux 3(内核5.10.134-17.al8
及更高版本)进行了优化。
优化方案说明
为了解决IPI风暴问题,设定所有并发获取CPU频率的线程或进程均需拿到一份最近的备份数据,该备份数据使用
atomic_xchg()
来进行原子交换操作,以检查和更新字段值,并且失效时间大约为20 ms。获取CPU频率的任务超过该失效时间才会发起新的smp_call_function_single()
调用来请求更新数据,避免同一时间段内向同一个CPU重复发送大量中断。通过
/proc/cpuinfo
获取CPU频率时,系统会向所有CPU发送IPI消息,此方式会导致原本处于idle
(闲置)状态的CPU被迫唤醒,在CPU唤醒过程中,其运行频率会发生变化(由动态调度算法决定)。为提高系统效率,我们对这种情况做了进一步的优化,当CPU处于idle
状态时,Alibaba Cloud Linux 3默认开启NOHZ特性,系统将不再对其发起IPI请求,而是直接返回基础频率,从而避免不必要的CPU状态变换带来的频率测量偏差。
优势和负面效果说明
优势
减少资源消耗:通过减少系统对IPI的不当使用,进一步降低了唤醒空闲CPU的需求,从而有效节省了处理器时间。
优化整体性能:特别是在多核系统环境下,减少对其他CPU管理活动(如任务调度)的影响,保持系统高效稳定运行。
负面效果说明
该优化方案虽然能够减少资源消耗并提升整体系统运行性能,但也导致通过
/proc/cpuinfo
获取的idle
状态CPU频率低于idle
状态的CPU频率(造成“降频”的假象),通过turbostat
等工具直接读取MSR仍可获得准确的CPU频率数据。