最近由于 Linaro 和 ARM 主导的 EAS(Energy Aware Scheduler) 日渐完善,属于 EAS 一部分的基于调度器的调频技术也获得了很多关注。本文主要介绍基于调度器的 CPU 调频策略的原理,以及当前上游社区在这一方面最新的进展。
传统 CPU 调频策略
传统 CPU 调频模块主要分为 3 块:CPUFreq 核心模块、CPUFreq 驱动和 CPUFreq Governor。核心模块主要是一些公共的逻辑和 API,CPUFreq 驱动是处理和平台相关的逻辑,比如设置 CPU 的频率和电压。而 Governor 就是我们今天要讲的主角,CPU 调频的策略。CPU 在什么样负载,什么样的场景下应该跑多少频率,都是通过 CPUFreq Governor 采取一定策略来决定的,然后调用 cpufreq_driver->target() 来设置要调整的频率。
那么传统 CPUFreq Governor 是如何选择当前 CPU 的频率的呢?performance 和 powersave 这两个 governor 就不说了,一个是让 CPU 一直跑在最高频率,另外一个是让 CPU 跑在最低频率,所有的动作都在初始化的时候做了,本身也没有什么策略。userspace 只是实现了 scaling_setspeed 节点,主要策略在用户态,也没什么可讲的。而 ondemand 和 conservation 两个 governor 则是开启一个 timer,定期去计算各个 CPU 的负载。当 CPU 负载超过 80% 时,ondemand 就会把 CPU 频率调到最高,其他情况则会根据当前负载按比例计算频率。而对于 conservation 而言,CPU 负载超过 80% 时,默认会以 5% 的步伐递增;当 CPU 负载少于 2