频率/CPU 不变性¶
由于在 1GHz 下消耗 CPU 50% 与在 2GHz 下消耗 CPU 50% 不同,并且在 LITTLE CPU 上运行 50% 与在 big CPU 上运行 50% 不同,因此我们允许架构使用两个比率来缩放时间增量,一个动态电压和频率缩放 (DVFS) 比率和一个微架构比率。
对于简单的 DVFS 架构(软件完全控制),我们可以轻松地将比率计算为
f_cur
r_dvfs := -----
f_max
对于硬件控制 DVFS 的更动态的系统,我们使用硬件计数器(Intel APERF/MPERF、ARMv8.4-AMU)来提供该比率。 具体来说,对于 Intel,我们使用
APERF
f_cur := ----- * P0
MPERF
4C-turbo; if available and turbo enabled
f_max := { 1C-turbo; if turbo enabled
P0; otherwise
f_cur
r_dvfs := min( 1, ----- )
f_max
我们选择 4C turbo 而不是 1C turbo,以使其更可持续。
r_cpu 确定为当前 CPU 的最高性能级别与系统中任何其他 CPU 的最高性能级别的比率。
r_tot = r_dvfs * r_cpu
结果是上述 “running” 和 “runnable” 指标变为 DVFS 和 CPU 类型的不变量。 换句话说,我们可以在 CPU 之间传输和比较它们。
有关更多详细信息,请参见
kernel/sched/pelt.h:update_rq_clock_pelt()
arch/x86/kernel/smpboot.c:”APERF/MPERF frequency ratio computation.”
容量感知调度:”1. CPU 容量 + 2. 任务利用率”