1 .. SPDX-License-Identifier: GPL-2.0 2 .. include:: ../disclaimer-zh_CN.rst 3 4 :Original: Documentation/scheduler/sched-capac 5 6 :翻译: 7 8 唐艺舟 Tang Yizhou <tangyeechou@gmail.com> 9 10 :校译: 11 12 时奎亮 Alex Shi <alexs@kernel.org> 13 14 ============= 15 算力感知调度 16 ============= 17 18 1. CPU算力 19 ========== 20 21 1.1 简介 22 -------- 23 24 一般来说,同构的SMP平台由完全相 25 平台中,CPU不能被认为是相同的。 26 27 我们引入CPU算力(capacity)的概念 28 做过归一化处理。异构系统也被称 29 30 最大可达性能(换言之,最大CPU算 31 32 - 不是所有CPU的微架构都相同。 33 - 在动态电压频率升降(Dynamic Voltag 34 能达到一样高的操作性能值(Opera 35 36 Arm大小核(big.LITTLE)系统是同时具 37 流水线层级,更大的缓存,更智能 38 39 CPU性能通常由每秒百万指令(Million 40 per Hz能执行的指令数,故:: 41 42 capacity(cpu) = work_per_hz(cpu) * max_freq( 43 44 1.2 调度器术语 45 -------------- 46 47 调度器使用了两种不同的算力值。C 48 CPU的 ``capacity`` 是 ``capacity_orig`` 扣 49 50 注意CPU的 ``capacity`` 仅仅被设计用 51 简洁起见,本文档的剩余部分将不 52 53 1.3 平台示例 54 ------------ 55 56 1.3.1 操作性能值相同 57 ~~~~~~~~~~~~~~~~~~~~ 58 59 考虑一个假想的双核非对称CPU算力 60 61 - work_per_hz(CPU0) = W 62 - work_per_hz(CPU1) = W/2 63 - 所有CPU以相同的固定频率运行 64 65 根据上文对算力的定义: 66 67 - capacity(CPU0) = C 68 - capacity(CPU1) = C/2 69 70 若这是Arm大小核系统,那么CPU0是大 71 72 考虑一种周期性产生固定工作量的 73 74 CPU0 work ^ 75 | ____ ____ 76 | | | | | 77 +----+----+----+----+----+----+---- 78 79 CPU1 work ^ 80 | _________ _________ 81 | | | | 82 +----+----+----+----+----+----+---- 83 84 CPU0在系统中具有最高算力(C), 85 算力,因此在T个单位时间内仅完成 86 87 1.3.2 最大操作性能值不同 88 ~~~~~~~~~~~~~~~~~~~~~~~~ 89 90 具有不同算力值的CPU,通常来说最 91 work_per_hz()相同): 92 93 - max_freq(CPU0) = F 94 - max_freq(CPU1) = 2/3 * F 95 96 这将推出: 97 98 - capacity(CPU0) = C 99 - capacity(CPU1) = C/3 100 101 执行1.3.1节描述的工作负载,每个CP 102 103 CPU0 work ^ 104 | ____ ____ 105 | | | | | 106 +----+----+----+----+----+----+---- 107 108 workload on CPU1 109 CPU1 work ^ 110 | ______________ _________ 111 | | | | 112 +----+----+----+----+----+----+---- 113 114 1.4 关于计算方式的注意事项 115 -------------------------- 116 117 需要注意的是,使用单一值来表示C 118 描述为:X%整数运算差异,Y%浮点数 119 的结果目前还是令人满意的。 120 121 2. 任务使用率 122 ============= 123 124 2.1 简介 125 -------- 126 127 算力感知调度要求描述任务需求, 128 任务使用率是CFS独有的描述方式, 129 130 任务使用率是一种用百分比来描述 131 132 task_util(p) = duty_cycle(p) 133 134 在频率固定的SMP系统中,100%的利用 135 小周期任务,它在睡眠上花费的时 136 137 2.2 频率不变性 138 -------------- 139 140 一个需要考虑的议题是,工作负载 141 执行周期性工作负载:: 142 143 CPU work ^ 144 | ____ ____ 145 | | | | | 146 +----+----+----+----+----+----+---- 147 148 可以算出 duty_cycle(p) == 25%。 149 150 现在,考虑以给定频率F/2执行 *同 151 152 CPU work ^ 153 | _________ _________ 154 | | | | 155 +----+----+----+----+----+----+---- 156 157 可以算出 duty_cycle(p) == 50%,尽管两 158 相同)。 159 160 任务利用率信号可按下面公式处理 161 162 task_util_freq_inv(p) = duty_cycle(p) * (cur 163 164 对上面两个例子运用该公式,可以 165 166 2.3 CPU不变性 167 ------------- 168 169 CPU算力与任务利用率具有类型的效 170 占空比。 171 172 考虑1.3.2节提到的系统,也就是说:: 173 174 - capacity(CPU0) = C 175 - capacity(CPU1) = C/3 176 177 每个CPU按最大频率执行指定周期性 178 179 CPU0 work ^ 180 | ____ ____ 181 | | | | | 182 +----+----+----+----+----+----+---- 183 184 CPU1 work ^ 185 | ______________ _________ 186 | | | | 187 +----+----+----+----+----+----+---- 188 189 也就是说, 190 191 - duty_cycle(p) == 25%,如果任务p在CPU0 192 - duty_cycle(p) == 75%,如果任务p在CPU1 193 194 任务利用率信号可按下面公式处理 195 196 task_util_cpu_inv(p) = duty_cycle(p) * (capa 197 198 其中 ``max_capacity`` 是系统中最高的C 199 的任务利用率均为25%。 200 201 2.4 任务利用率不变量 202 -------------------- 203 204 频率和CPU算力不变性都需要被应用 205 任务利用率的伪计算公式是同时具 206 207 curr_freq 208 task_util_inv(p) = duty_cycle(p) * --------- 209 max_frequ 210 211 也就是说,任务利用率不变量假定 212 213 在接下来的章节中提到的任何任务 214 215 2.5 利用率估算 216 -------------- 217 218 由于预测未来的水晶球不存在,当 219 CFS调度类基于实体负载跟踪机制(P 220 其中之一可以算出平均利用率(与 221 222 这意味着,尽管运用“真实的”任 223 用任务利用率的估算值。 224 225 3. 算力感知调度的需求 226 ===================== 227 228 3.1 CPU算力 229 ----------- 230 231 当前,Linux无法凭自身算出CPU算力 232 定义arch_scale_cpu_capacity()函数。 233 234 arm、arm64和RISC-V架构直接把这个信 235 arch_topology.h的percpu变量cpu_scale), 236 出来的。参见Documentation/devicetree/bin 237 238 3.2 频率不变性 239 -------------- 240 241 如2.2节所述,算力感知调度需要频 242 arch_scale_freq_capacity(cpu)函数。 243 244 实现该函数要求计算出每个CPU当前 245 APERF/MPERF,arm64的AMU),它能按CPU当 246 在cpufreq频率变化时直接使用钩子函 247 248 4. 调度器拓扑结构 249 ================= 250 251 在构建调度域时,调度器将会发现 252 253 - sched_asym_cpucapacity静态键(static key 254 - SD_ASYM_CPUCAPACITY_FULL标志位将在尽 255 完整包含某个CPU算力值的全部CPU 256 - SD_ASYM_CPUCAPACITY标志将在所有包含 257 258 sched_asym_cpucapacity静态键的设计意图 259 是,这个键是系统范围可见的。想 260 261 capacity C/2 C 262 ________ ________ 263 / \ / \ 264 CPUs 0 1 2 3 4 5 6 7 265 \__/ \______________/ 266 cpusets cs0 cs1 267 268 可以通过下面的方式创建: 269 270 .. code-block:: sh 271 272 mkdir /sys/fs/cgroup/cpuset/cs0 273 echo 0-1 > /sys/fs/cgroup/cpuset/cs0/cpuset. 274 echo 0 > /sys/fs/cgroup/cpuset/cs0/cpuset.me 275 276 mkdir /sys/fs/cgroup/cpuset/cs1 277 echo 2-7 > /sys/fs/cgroup/cpuset/cs1/cpuset. 278 echo 0 > /sys/fs/cgroup/cpuset/cs1/cpuset.me 279 280 echo 0 > /sys/fs/cgroup/cpuset/cpuset.sched_ 281 282 由于“这是”非对称CPU算力系统,s 283 调度域层级,算力值仅有一个,该 284 应该被以此处理。 285 286 因此,“典型的”保护非对称CPU算 287 288 - 检查sched_asym_cpucapacity静态键 289 - 如果它被使能,接着检查调度域 290 291 5. 算力感知调度的实现 292 ===================== 293 294 5.1 CFS 295 ------- 296 297 5.1.1 算力适应性(fitness) 298 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 299 300 CFS最主要的算力调度准则是:: 301 302 task_util(p) < capacity(task_cpu(p)) 303 304 它通常被称为算力适应性准则。也 305 任务将要更长地消耗该CPU,任务是C 306 307 此外,uclamp允许用户空间指定任务 308 cgroup接口的方式(参阅Documentation/ad 309 可以被用在前一条准则中限制task_ut 310 311 5.1.2 被唤醒任务的CPU选择 312 ~~~~~~~~~~~~~~~~~~~~~~~~~ 313 314 CFS任务唤醒的CPU选择,遵循上面描 315 这令用户空间对CFS任务的CPU选择有 316 条件的CPU:: 317 318 clamp(task_util(p), task_uclamp_min(p), task 319 320 通过使用uclamp,举例来说,用户空 321 它设置低的uclamp.max值。相反,uclamp 322 的CPU上运行,只要给它设置高的ucla 323 324 .. note:: 325 326 CFS的被唤醒的任务的CPU选择,可 327 Documentation/scheduler/sched-energy.rst中 328 329 5.1.3 负载均衡 330 ~~~~~~~~~~~~~~ 331 332 被唤醒任务的CPU选择的一个病理性 333 334 w == wakeup event 335 336 capacity(CPU0) = C 337 capacity(CPU1) = C / 3 338 339 workload on CPU0 340 CPU work ^ 341 | _________ _________ 342 | | | | 343 +----+----+----+----+----+----+---- 344 w w 345 346 workload on CPU1 347 CPU work ^ 348 | _____________________________ 349 | | 350 +----+----+----+----+----+----+---- 351 w 352 353 该工作负载应该在CPU0上运行,不过 354 355 - 一开始发生不合适的调度(不准 356 - 一开始调度正确,但突然需要更 357 358 则任务可能变为CPU受限的,也就是 359 调度准则被违反,将不会有任何唤 360 361 这种场景下的任务被称为“不合适 362 任务迁移借助CFS负载均衡器,更明 363 当发生负载均衡时,如果一个misfit 364 那么misfit任务的主动负载均衡将被 365 366 5.2 实时调度 367 ------------ 368 369 5.2.1 被唤醒任务的CPU选择 370 ~~~~~~~~~~~~~~~~~~~~~~~~~ 371 372 实时任务唤醒时的CPU选择,搜索满 373 374 task_uclamp_min(p) <= capacity(task_cpu(cpu) 375 376 同时仍然允许接着使用常规的优先 377 优先级的调度,CPU算力将被忽略。 378 379 5.3 最后期限调度 380 ---------------- 381 382 5.3.1 被唤醒任务的CPU选择 383 ~~~~~~~~~~~~~~~~~~~~~~~~~ 384 385 最后期限任务唤醒时的CPU选择,搜 386 387 task_bandwidth(p) < capacity(task_cpu(p)) 388 389 同时仍然允许接着使用常规的带宽 390 在当前CPU队列中。
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.