1 .. SPDX-License-Identifier: GPL-2.0 2 .. include:: ../disclaimer-zh_CN.rst 3 4 :Original: Documentation/scheduler/schedutil.r 5 6 :翻译: 7 8 唐艺舟 Tang Yizhou <tangyeechou@gmail.com> 9 10 ========= 11 Schedutil 12 ========= 13 14 .. note:: 15 16 本文所有内容都假设频率和工作 17 但这是最可行的近似处理。 18 19 PELT(实体负载跟踪,Per Entity Load Tr 20 ============================================== 21 22 通过PELT,我们跟踪了各种调度器实 23 运行队列。我们使用指数加权移动 24 EWMA)作为其基础,每个周期(1024us 25 也就是说,最近的32ms贡献负载的一 26 27 具体而言: 28 29 ewma_sum(u) := u_0 + u_1*y + u_2*y^2 + ... 30 31 ewma(u) = ewma_sum(u) / ewma_sum(1) 32 33 由于这本质上是一个无限几何级数 34 这个属性是关键,因为它提供了在 35 36 请注意,阻塞态的任务仍然对累加 37 它们在恢复运行后的预期贡献。 38 39 利用这一点,我们跟踪2个关键指标 40 在CPU上花费的时间,而“可运行” 41 一个任务时,这两个指标是相同的 42 任务在CPU上花费的时间,而“可运 43 44 更多细节见:kernel/sched/pelt.c 45 46 47 频率 / CPU不变性 48 ================ 49 50 因为CPU频率在1GHz时利用率为50%和CPU 51 在小核上运行时利用率为50%和在大 52 以两个比率来伸缩时间差,其中一 53 Frequency Scaling,DVFS)比率,另一个 54 55 对于简单的DVFS架构(软件有完全控 56 57 f_cur 58 r_dvfs := ----- 59 f_max 60 61 对于由硬件控制DVFS的更多动态系统 62 ARMv8.4-AMU)来计算这一比率。具体 63 64 APERF 65 f_cur := ----- * P0 66 MPERF 67 68 4C-turbo; 如果可用并且使 69 f_max := { 1C-turbo; 如果使能了turbo 70 P0; 其它情况 71 72 f_cur 73 r_dvfs := min( 1, ----- ) 74 f_max 75 76 我们选择4C turbo而不是1C turbo,以使 77 78 r_cpu被定义为当前CPU的最高性能水 79 80 r_tot = r_dvfs * r_cpu 81 82 其结果是,上述“运行”和“可运 83 我们可以在CPU之间转移和比较它们 84 85 更多细节见: 86 87 - kernel/sched/pelt.h:update_rq_clock_pelt() 88 - arch/x86/kernel/smpboot.c:"APERF/MPERF freq 89 - Documentation/translations/zh_CN/scheduler/ 90 91 92 UTIL_EST 93 ======== 94 95 由于周期性任务的平均数在睡眠时 96 因此它们在再次运行后会面临(DVFS 97 98 为了缓解这个问题,(一个默认使 99 (Infinite Impulse Response,IIR)的EWMA 100 UTIL_EST滤波使其在遇到更高值时立 101 102 进一步,运行队列的(可运行任务 103 104 util_est := \Sum_t max( t_running, t_util_es 105 106 更多细节见: kernel/sched/fair.c:util_est_ 107 108 109 UCLAMP 110 ====== 111 112 可以在每个CFS或RT任务上设置有效 113 为类似滤波器的能力,它定义了有 114 运行的任务保持这些clamp的最大聚 115 116 更多细节见: include/uapi/linux/sched/type 117 118 119 Schedutil / DVFS 120 ================ 121 122 每当调度器的负载跟踪被更新时( 123 schedutil来更新硬件DVFS状态。 124 125 其基础是CPU运行队列的“运行”指 126 估计值。由此我们计算出一个期望 127 128 max( running, util_est ); 如果 129 u_cfs := { running; 其它 130 131 clamp( u_cfs + u_rt, u_min, u_m 132 u_clamp := { u_cfs + u_rt; 133 134 u := u_clamp + u_irq + u_dl; [估 135 136 f_des := min( f_max, 1.25 u * f_max ) 137 138 关于IO-wait的说明:当发生更新是因 139 140 然后,这个频率被用来选择一个P-st 141 请求。 142 143 关于截止期限调度器的说明: 截止 144 工作负荷所需的硬f_min值。 145 146 因为这些回调函数是直接来自调度 147 在硬件交互缓慢和昂贵的时候,sche 148 149 更多信息见: kernel/sched/cpufreq_scheduti 150 151 152 注意 153 ==== 154 155 - 在低负载场景下,DVFS是最相关的 156 157 - 在负载饱和的场景下,任务迁移 158 CPU,有4个任务占用导致其饱和, 159 旧的CPU的“运行”值将为0.75,而 160 时间流逝将自动修正。另注,由 161 162 - 上述大部分内容是关于避免DVFS下 163 重新学习/提升频率。 164
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.