通过/proc/cpuinfo获取CPU频率优化说明

当多个线程或进程同时并发读取/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频率数据。