关注了就能看到更多这么棒的文章哦~
The pseudo cpuidle driver
By Jonathan Corbet
May 21, 2020
OSPM
原文来自:https://lwn.net/Articles/820870/
主译:DeepL
cpuidle governor是用来决定CPU在没有事情需要做的时候应该进入哪个idle state,决定好了之后,cpuidle driver会将CPU实际变动到这个idle state。但是,在2020年的Linux内核峰会(OSPM)上,Abhishek Goel展示了一个新的cpuidle driver,它其实根本不会改变处理器的power state。这样的driver显然不会省电,但作为评估和调试cpuidle policy的工具,会很有价值。
Goel首先介绍说,他做这项工作,主要是跟high-latency idle state有关的一个性能问题。也就是说,更深的CPU sleep state会需要更多时间才能退出,从而让CPU恢复工作状态。一个GPU工作密集型的workload会产生许多许多中断,这些中断之间的时间间隔刚好会让cpuidle governor来选择了一些更深的idle state。随着workload的继续进行,这里导致的latency也会随着时间的推移而增加。有一个临时的解决方法,就是将这些idle state的target latency(预期会睡眠的时长)增加三到五倍,这样governor在选择是就会偏向于较浅的idle状态。这个方法可以解决这个问题,但 "并不优雅"。其他一些人会发现他们的workload行为不太正常了。
Rafael Wysocki插话说,建议使用pm_qos机制来代替,pm_qos就是为了解决这种延迟问题,他很想知道为什么它不够用。很明显,有一个问题是pm_qos会完全禁用掉那些较深的idle state,而实际上当出现很长的空闲时间时,还是应该允许进入这些较深的idle state的。Parth Shah 补充说,在 Power体系架构上,这一点更加重要,因为如果不进入这些更深的空闲状态,则几乎不会节省功耗。
Goel试图给cpuidle的核心代码提供一个debugfs接口,允许在runtime可以调整各种空闲状态的residency属性(即进出耗时等属性——译者注)。这样对于验证idle state很有用,但要把这些变化也能跟内核内部状态同步好,这是很麻烦的。改变这些属性也会导致CPU的idle history变化(distortion),从而导致各种奇怪的行为。他希望有一个更好的解决方案。
于是就引出了pseudo cpuidle driver(伪cpuidle驱动)。这是一个loadable module,允许用户创建自定义的空闲状态,并随心所欲地调整属性。这样做就避免了同步问题和history-distortion问题。该模块加载了一组参数,描述了idle state的数量,以及每个状态的target residency和exit latency参数。实际的 "idle states "实现其实是将CPU放入一个busy-wait loop,一直等到下一个唤醒事件发生,然后governor会再busy wait一小段时间来模拟exit latency消耗时间。
这种行为显然对于省电没有帮助,但它对评估特定策略对系统性能的影响很有用。可以用来调试governor行为,或者比较两个完全不同的governor的效果。他说,事实证明对CPU设计也很有用,设计者可以尝试各种idle state,看看它们的表现如何。
他总结说,未来可能还会像模拟基本的CPU状态一样来模拟core和chip级别的idle状态。他还计划在driver中加入一些tracing机制。
Wysocki指出了一个潜在问题。在真实的系统中,对硬件中断的响应会受处理器idle状态的exit latency而延迟。模拟这种延迟的唯一方法是在中断被禁用的情况下进行忙等待,但这样一来,中断(通常会唤醒系统)就会被完全错过。这种特定的硬件行为似乎无法用这种方式来模拟。话虽如此,但他同意这个driver看起来对研究cpuidle governor很有用,值得拥有。
在会议的最后,Juri Lelli问道,是否有什么性能跑分来比较这个driver与真实硬件的性能区别,Goel回答说目前还没有。
全文完
LWN文章遵循CC BY-SA 4.0许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~