.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_CN.rst :Original: Documentation/scheduler/schedutil.rst :翻译: å”艺舟 Tang Yizhou <tangyeechou@gmail.com> ========= Schedutil ========= .. note:: 本文所有内容都å‡è®¾é¢‘率和工作算力之间å˜åœ¨çº¿æ€§å…³ç³»ã€‚我们知é“这是有瑕疵的, 但这是最å¯è¡Œçš„近似处ç†ã€‚ PELT(实体负载跟踪,Per Entity Load Tracking) ============================================== 通过PELT,我们跟踪了å„ç§è°ƒåº¦å™¨å®žä½“çš„ä¸€äº›æŒ‡æ ‡ï¼Œä»Žå•个任务到任务组分片到CPU è¿è¡Œé˜Ÿåˆ—ã€‚æˆ‘ä»¬ä½¿ç”¨æŒ‡æ•°åŠ æƒç§»åЍ平凿•°ï¼ˆExponentially Weighted Moving Average, EWMA)作为其基础,æ¯ä¸ªå‘¨æœŸï¼ˆ1024us)都会衰å‡ï¼Œè¡°å‡é€ŸçŽ‡æ»¡è¶³y^32 = 0.5。 也就是说,最近的32ms贡献负载的一åŠï¼Œè€Œåކå²ä¸Šçš„其它时间则贡献å¦ä¸€åŠã€‚ 具体而言: ewma_sum(u) := u_0 + u_1*y + u_2*y^2 + ... ewma(u) = ewma_sum(u) / ewma_sum(1) ç”±äºŽè¿™æœ¬è´¨ä¸Šæ˜¯ä¸€ä¸ªæ— é™å‡ ä½•çº§æ•°çš„ç´¯åŠ ï¼Œç»“æžœæ˜¯å¯ç»„åˆçš„,å³ewma(A) + ewma(B) = ewma(A+B)。 è¿™ä¸ªå±žæ€§æ˜¯å…³é”®ï¼Œå› ä¸ºå®ƒæä¾›äº†åœ¨ä»»åŠ¡è¿ç§»æ—¶é‡æ–°ç»„åˆå¹³å‡æ•°çš„能力。 请注æ„,阻塞æ€çš„任务ä»ç„¶å¯¹ç´¯åŠ å€¼ï¼ˆä»»åŠ¡ç»„åˆ†ç‰‡å’ŒCPUè¿è¡Œé˜Ÿåˆ—ï¼‰æœ‰è´¡çŒ®ï¼Œè¿™åæ˜ 了 它们在æ¢å¤è¿è¡ŒåŽçš„预期贡献。 利用这一点,我们跟踪2ä¸ªå…³é”®æŒ‡æ ‡ï¼šâ€œè¿è¡Œâ€å’Œâ€œå¯è¿è¡Œâ€ã€‚“è¿è¡Œâ€åæ˜ äº†ä¸€ä¸ªè°ƒåº¦å®žä½“ 在CPU上花费的时间,而“å¯è¿è¡Œâ€åæ˜ äº†ä¸€ä¸ªè°ƒåº¦å®žä½“åœ¨è¿è¡Œé˜Ÿåˆ—ä¸èŠ±è´¹çš„æ—¶é—´ã€‚å½“åªæœ‰ ä¸€ä¸ªä»»åŠ¡æ—¶ï¼Œè¿™ä¸¤ä¸ªæŒ‡æ ‡æ˜¯ç›¸åŒçš„,但一旦出现对CPU的争用,“è¿è¡Œâ€å°†å‡å°‘ä»¥åæ˜ æ¯ä¸ª 任务在CPU上花费的时间,而“å¯è¿è¡Œâ€å°†å¢žåŠ ä»¥åæ˜ 争用的激烈程度。 更多细节è§ï¼škernel/sched/pelt.c 频率 / CPUä¸å˜æ€§ ================ å› ä¸ºCPU频率在1GHz时利用率为50%å’ŒCPU频率在2GHz时利用率为50%是ä¸ä¸€æ ·çš„ï¼ŒåŒæ · åœ¨å°æ ¸ä¸Šè¿è¡Œæ—¶åˆ©ç”¨çŽ‡ä¸º50%å’Œåœ¨å¤§æ ¸ä¸Šè¿è¡Œæ—¶åˆ©ç”¨çŽ‡ä¸º50%是ä¸ä¸€æ ·çš„,我们å…许架构 以两个比率æ¥ä¼¸ç¼©æ—¶é—´å·®ï¼Œå…¶ä¸ä¸€ä¸ªæ˜¯åЍæ€ç”µåŽ‹é¢‘çŽ‡å‡é™ï¼ˆDynamic Voltage and Frequency Scaling,DVFS)比率,å¦ä¸€ä¸ªæ˜¯å¾®æž¶æž„比率。 对于简å•çš„DVFS架构(软件有完全控制能力),我们å¯ä»¥å¾ˆå®¹æ˜“地计算该比率为:: f_cur r_dvfs := ----- f_max 对于由硬件控制DVFS的更多动æ€ç³»ç»Ÿï¼Œæˆ‘们使用硬件计数器(Intel APERF/MPERF, ARMv8.4-AMU)æ¥è®¡ç®—这一比率。具体到Intel,我们使用:: APERF f_cur := ----- * P0 MPERF 4C-turbo; 如果å¯ç”¨å¹¶ä¸”使能了turbo f_max := { 1C-turbo; 如果使能了turbo P0; 其它情况 f_cur r_dvfs := min( 1, ----- ) f_max 我们选择4C turboè€Œä¸æ˜¯1C turbo,以使其更æŒä¹…性略微更强。 r_cpu被定义为当å‰CPU的最高性能水平与系统ä¸ä»»ä½•其它CPU的最高性能水平的比率。 r_tot = r_dvfs * r_cpu 其结果是,上述“è¿è¡Œâ€å’Œâ€œå¯è¿è¡Œâ€çš„æŒ‡æ ‡å˜æˆDVFSæ— å…³å’ŒCPUåž‹å·æ— 关了。也就是说, 我们å¯ä»¥åœ¨CPU之间转移和比较它们。 更多细节è§: - kernel/sched/pelt.h:update_rq_clock_pelt() - arch/x86/kernel/smpboot.c:"APERF/MPERF frequency ratio computation." - Documentation/translations/zh_CN/scheduler/sched-capacity.rst:"1. CPU Capacity + 2. Task utilization" UTIL_EST ======== ç”±äºŽå‘¨æœŸæ€§ä»»åŠ¡çš„å¹³å‡æ•°åœ¨ç¡çœ 时会衰å‡ï¼Œè€Œåœ¨è¿è¡Œæ—¶å…¶é¢„期利用率会和ç¡çœ å‰ç›¸åŒï¼Œ å› æ¤å®ƒä»¬åœ¨å†æ¬¡è¿è¡ŒåŽä¼šé¢ä¸´ï¼ˆDVFS)的上涨。 为了缓解这个问题,(一个默认使能的编译选项)UTIL_ESTé©±åŠ¨ä¸€ä¸ªæ— é™è„‰å†²å“应 (Infinite Impulse Response,IIR)的EWMA,“è¿è¡Œâ€å€¼åœ¨å‡ºé˜Ÿæ—¶æ˜¯æœ€é«˜çš„。 UTIL_EST滤波使其在é‡åˆ°æ›´é«˜å€¼æ—¶ç«‹åˆ»å¢žåŠ ï¼Œè€Œé‡åˆ°ä½Žå€¼æ—¶ä¼šç¼“慢衰å‡ã€‚ 进一æ¥ï¼Œè¿è¡Œé˜Ÿåˆ—的(å¯è¿è¡Œä»»åŠ¡çš„ï¼‰åˆ©ç”¨çŽ‡ä¹‹å’Œç”±ä¸‹å¼è®¡ç®—: util_est := \Sum_t max( t_running, t_util_est_ewma ) 更多细节è§: kernel/sched/fair.c:util_est_dequeue() UCLAMP ====== å¯ä»¥åœ¨æ¯ä¸ªCFS或RT任务上设置有效的u_minå’Œu_max clamp值(译注:clampå¯ä»¥ç†è§£ 为类似滤波器的能力,它定义了有效å–值范围的最大值和最å°å€¼ï¼‰ï¼›è¿è¡Œé˜Ÿåˆ—为所有æ£åœ¨ è¿è¡Œçš„ä»»åŠ¡ä¿æŒè¿™äº›clamp的最大èšåˆå€¼ã€‚ 更多细节è§: include/uapi/linux/sched/types.h Schedutil / DVFS ================ æ¯å½“调度器的负载跟踪被更新时(任务唤醒ã€ä»»åŠ¡è¿ç§»ã€æ—¶é—´æµé€ï¼‰ï¼Œæˆ‘们都会调用 schedutilæ¥æ›´æ–°ç¡¬ä»¶DVFS状æ€ã€‚ 其基础是CPUè¿è¡Œé˜Ÿåˆ—的“è¿è¡Œâ€æŒ‡æ ‡ï¼Œæ ¹æ®ä¸Šé¢çš„内容,它是CPU的频率ä¸å˜çš„利用率 ä¼°è®¡å€¼ã€‚ç”±æ¤æˆ‘们计算出一个期望的频率,如下:: max( running, util_est ); 如果使能UTIL_EST u_cfs := { running; 其它情况 clamp( u_cfs + u_rt, u_min, u_max ); 如果使能UCLAMP_TASK u_clamp := { u_cfs + u_rt; 其它情况 u := u_clamp + u_irq + u_dl; [ä¼°è®¡å€¼ã€‚æ›´å¤šç»†èŠ‚è§æºä»£ç ] f_des := min( f_max, 1.25 u * f_max ) 关于IO-wait的说明:当å‘ç”Ÿæ›´æ–°æ˜¯å› ä¸ºä»»åŠ¡ä»ŽIO完æˆä¸å”¤é†’时,我们æå‡ä¸Šé¢çš„“uâ€ã€‚ ç„¶åŽï¼Œè¿™ä¸ªé¢‘率被用æ¥é€‰æ‹©ä¸€ä¸ªP-state或OPP,或者直接混入一个å‘给硬件的CPPCå¼ è¯·æ±‚ã€‚ å…³äºŽæˆªæ¢æœŸé™è°ƒåº¦å™¨çš„说明: æˆªæ¢æœŸé™ä»»åŠ¡ï¼ˆå¶å‘任务模型)使我们能够计算出满足 å·¥ä½œè´Ÿè·æ‰€éœ€çš„硬f_min值。 å› ä¸ºè¿™äº›å›žè°ƒå‡½æ•°æ˜¯ç›´æŽ¥æ¥è‡ªè°ƒåº¦å™¨çš„,所以DVFS的硬件交互应该是“快速â€å’Œéžé˜»å¡žçš„。 在硬件交互缓慢和昂贵的时候,schedutil支æŒDVFS请求é™é€Ÿï¼Œä¸è¿‡ä¼šé™ä½Žæ•ˆçŽ‡ã€‚ 更多信æ¯è§: kernel/sched/cpufreq_schedutil.c æ³¨æ„ ==== - 在低负载场景下,DVFS是最相关的,“è¿è¡Œâ€çš„å€¼å°†å¯†åˆ‡åæ˜ 利用率。 - 在负载饱和的场景下,任务è¿ç§»ä¼šå¯¼è‡´ä¸€äº›çž¬æ—¶æ€§çš„使用率下é™ã€‚å‡è®¾æˆ‘们有一个 CPU,有4个任务å ç”¨å¯¼è‡´å…¶é¥±å’Œï¼ŒæŽ¥ä¸‹æ¥æˆ‘们将一个任务è¿ç§»åˆ°å¦ä¸€ä¸ªç©ºé—²CPU上, æ—§çš„CPU的“è¿è¡Œâ€å€¼å°†ä¸º0.75,而新的CPU将获得0.25。这是ä¸å¯é¿å…的,而且éšç€ æ—¶é—´æµé€å°†è‡ªåŠ¨ä¿®æ£ã€‚妿³¨ï¼Œç”±äºŽæ²¡æœ‰ç©ºé—²æ—¶é—´ï¼Œæˆ‘们还能ä¿è¯f_max值å—? - 上述大部分内容是关于é¿å…DVFS下滑,以åŠç‹¬ç«‹çš„DVFS域å‘生负载è¿ç§»æ—¶ä¸å¾—ä¸ é‡æ–°å¦ä¹ /æå‡é¢‘率。