sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/scheduler/sched-capacitymodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/zh_TW/scheduler/sched-capacitymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/it_IT/scheduler/sched-capacitymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/ja_JP/scheduler/sched-capacitymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/ko_KR/scheduler/sched-capacitymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/sp_SP/scheduler/sched-capacitymodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhY/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/scheduler/sched-capacity.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h+Documentation/scheduler/sched-capacity.rst h]h)}(h*Documentation/scheduler/sched-capacity.rsth]h*Documentation/scheduler/sched-capacity.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h.唐艺舟 Tang Yizhou h]h)}(h-唐艺舟 Tang Yizhou h](h唐艺舟 Tang Yizhou <}(hj hhhNhNubh reference)}(htangyeechou@gmail.comh]htangyeechou@gmail.com}(hj*hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:tangyeechou@gmail.comuh1j(hj ubh>}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h校译h]h校译}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhhhKubh)}(h&时奎亮 Alex Shi h]h)}(h%时奎亮 Alex Shi h](h时奎亮 Alex Shi <}(hjehhhNhNubj))}(halexs@kernel.orgh]halexs@kernel.org}(hjmhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:alexs@kernel.orguh1j(hjeubh>}(hjehhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjaubah}(h]h ]h"]h$]h&]uh1hhjPubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h算力感知调度h]h算力感知调度}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h 1. CPU算力h]h 1. CPU算力}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h 1.1 简介h]h 1.1 简介}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh)}(h一般来说,同构的SMP平台由完全相同的CPU构成。异构的平台则由性能特征不同的CPU构成,在这样的 平台中,CPU不能被认为是相同的。h]h一般来说,同构的SMP平台由完全相同的CPU构成。异构的平台则由性能特征不同的CPU构成,在这样的 平台中,CPU不能被认为是相同的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h我们引入CPU算力(capacity)的概念来测量每个CPU能达到的性能,它的值相对系统中性能最强的CPU 做过归一化处理。异构系统也被称为非对称CPU算力系统,因为它们由不同算力的CPU组成。h]h我们引入CPU算力(capacity)的概念来测量每个CPU能达到的性能,它的值相对系统中性能最强的CPU 做过归一化处理。异构系统也被称为非对称CPU算力系统,因为它们由不同算力的CPU组成。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hR最大可达性能(换言之,最大CPU算力)的差异有两个主要来源:h]hR最大可达性能(换言之,最大CPU算力)的差异有两个主要来源:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh bullet_list)}(hhh](h list_item)}(h'不是所有CPU的微架构都相同。h]h)}(hjh]h'不是所有CPU的微架构都相同。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h在动态电压频率升降(Dynamic Voltage and Frequency Scaling,DVFS)框架中,不是所有的CPU都 能达到一样高的操作性能值(Operating Performance Points,OPP。译注,也就是“频率-电压”对)。 h]h)}(h在动态电压频率升降(Dynamic Voltage and Frequency Scaling,DVFS)框架中,不是所有的CPU都 能达到一样高的操作性能值(Operating Performance Points,OPP。译注,也就是“频率-电压”对)。h]h在动态电压频率升降(Dynamic Voltage and Frequency Scaling,DVFS)框架中,不是所有的CPU都 能达到一样高的操作性能值(Operating Performance Points,OPP。译注,也就是“频率-电压”对)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK!hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhK hjhhubh)}(hArm大小核(big.LITTLE)系统是同时具有两种差异的一个例子。相较小核,大核面向性能(拥有更多的 流水线层级,更大的缓存,更智能的分支预测器等),通常可以达到更高的操作性能值。h]hArm大小核(big.LITTLE)系统是同时具有两种差异的一个例子。相较小核,大核面向性能(拥有更多的 流水线层级,更大的缓存,更智能的分支预测器等),通常可以达到更高的操作性能值。}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hjhhubh)}(hCPU性能通常由每秒百万指令(Millions of Instructions Per Second,MIPS)表示,也可表示为 per Hz能执行的指令数,故::h]hCPU性能通常由每秒百万指令(Millions of Instructions Per Second,MIPS)表示,也可表示为 per Hz能执行的指令数,故:}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK'hjhhubh literal_block)}(h0capacity(cpu) = work_per_hz(cpu) * max_freq(cpu)h]h0capacity(cpu) = work_per_hz(cpu) * max_freq(cpu)}hjVsbah}(h]h ]h"]h$]h&]hhuh1jThhhK*hjhhubeh}(h]id2ah ]h"] 1.1 简介ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h1.2 调度器术语h]h1.2 调度器术语}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlhhhhhK-ubh)}(h调度器使用了两种不同的算力值。CPU的 ``capacity_orig`` 是它的最大可达算力,即最大可达性能等级。 CPU的 ``capacity`` 是 ``capacity_orig`` 扣除了一些性能损失(比如处理中断的耗时)的值。h](h4调度器使用了两种不同的算力值。CPU的 }(hj}hhhNhNubhliteral)}(h``capacity_orig``h]h capacity_orig}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubhE 是它的最大可达算力,即最大可达性能等级。 CPU的 }(hj}hhhNhNubj)}(h ``capacity``h]hcapacity}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubh 是 }(hj}hhhNhNubj)}(h``capacity_orig``h]h capacity_orig}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubhF 扣除了一些性能损失(比如处理中断的耗时)的值。}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK/hjlhhubh)}(h注意CPU的 ``capacity`` 仅仅被设计用于CFS调度类,而 ``capacity_orig`` 是不感知调度类的。为 简洁起见,本文档的剩余部分将不加区分的使用术语 ``capacity`` 和 ``capacity_orig`` 。h](h 注意CPU的 }(hjhhhNhNubj)}(h ``capacity``h]hcapacity}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) 仅仅被设计用于CFS调度类,而 }(hjhhhNhNubj)}(h``capacity_orig``h]h capacity_orig}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhf 是不感知调度类的。为 简洁起见,本文档的剩余部分将不加区分的使用术语 }(hjhhhNhNubj)}(h ``capacity``h]hcapacity}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 和 }(hjhhhNhNubj)}(h``capacity_orig``h]h capacity_orig}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK2hjlhhubeh}(h]id3ah ]h"]1.2 调度器术语ah$]h&]uh1jhjhhhhhK-ubj)}(hhh](j)}(h1.3 平台示例h]h1.3 平台示例}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!hhhhhK6ubj)}(hhh](j)}(h1.3.1 操作性能值相同h]h1.3.1 操作性能值相同}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2hhhhhK9ubh)}(h<考虑一个假想的双核非对称CPU算力系统,其中h]h<考虑一个假想的双核非对称CPU算力系统,其中}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hj2hhubj)}(hhh](j)}(hwork_per_hz(CPU0) = Wh]h)}(hjVh]hwork_per_hz(CPU0) = W}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK=hjTubah}(h]h ]h"]h$]h&]uh1jhjQhhhhhNubj)}(hwork_per_hz(CPU1) = W/2h]h)}(hjmh]hwork_per_hz(CPU1) = W/2}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK>hjkubah}(h]h ]h"]h$]h&]uh1jhjQhhhhhNubj)}(h(所有CPU以相同的固定频率运行 h]h)}(h'所有CPU以相同的固定频率运行h]h'所有CPU以相同的固定频率运行}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK?hjubah}(h]h ]h"]h$]h&]uh1jhjQhhhhhNubeh}(h]h ]h"]h$]h&]j6j7uh1jhhhK=hj2hhubh)}(h根据上文对算力的定义:h]h根据上文对算力的定义:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKAhj2hhubj)}(hhh](j)}(hcapacity(CPU0) = Ch]h)}(hjh]hcapacity(CPU0) = C}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKChjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hcapacity(CPU1) = C/2 h]h)}(hcapacity(CPU1) = C/2h]hcapacity(CPU1) = C/2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]j6j7uh1jhhhKChj2hhubh)}(hG若这是Arm大小核系统,那么CPU0是大核,而CPU1是小核。h]hG若这是Arm大小核系统,那么CPU0是大核,而CPU1是小核。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKFhj2hhubh)}(hh考虑一种周期性产生固定工作量的工作负载,你将会得到类似下图的执行轨迹::h]hg考虑一种周期性产生固定工作量的工作负载,你将会得到类似下图的执行轨迹:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhj2hhubjU)}(hXCPU0 work ^ | ____ ____ ____ | | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time CPU1 work ^ | _________ _________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> timeh]hXCPU0 work ^ | ____ ____ ____ | | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time CPU1 work ^ | _________ _________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time}hjsbah}(h]h ]h"]h$]h&]hhuh1jThhhKJhj2hhubh)}(hCPU0在系统中具有最高算力(C),它使用T个单位时间完成固定工作量W。另一方面,CPU1只有CPU0一半 算力,因此在T个单位时间内仅完成工作量W/2。h]hCPU0在系统中具有最高算力(C),它使用T个单位时间完成固定工作量W。另一方面,CPU1只有CPU0一半 算力,因此在T个单位时间内仅完成工作量W/2。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKThj2hhubeh}(h]id5ah ]h"]1.3.1 操作性能值相同ah$]h&]uh1jhj!hhhhhK9ubj)}(hhh](j)}(h!1.3.2 最大操作性能值不同h]h!1.3.2 最大操作性能值不同}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&hhhhhKXubh)}(h具有不同算力值的CPU,通常来说最大操作性能值也不同。考虑上一小节提到的CPU(也就是说, work_per_hz()相同):h]h具有不同算力值的CPU,通常来说最大操作性能值也不同。考虑上一小节提到的CPU(也就是说, work_per_hz()相同):}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKZhj&hhubj)}(hhh](j)}(hmax_freq(CPU0) = Fh]h)}(hjJh]hmax_freq(CPU0) = F}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK]hjHubah}(h]h ]h"]h$]h&]uh1jhjEhhhhhNubj)}(hmax_freq(CPU1) = 2/3 * F h]h)}(hmax_freq(CPU1) = 2/3 * Fh]hmax_freq(CPU1) = 2/3 * F}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK^hj_ubah}(h]h ]h"]h$]h&]uh1jhjEhhhhhNubeh}(h]h ]h"]h$]h&]j6j7uh1jhhhK]hj&hhubh)}(h这将推出:h]h这将推出:}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK`hj&hhubj)}(hhh](j)}(hcapacity(CPU0) = Ch]h)}(hjh]hcapacity(CPU0) = C}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hcapacity(CPU1) = C/3 h]h)}(hcapacity(CPU1) = C/3h]hcapacity(CPU1) = C/3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKchjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]j6j7uh1jhhhKbhj&hhubh)}(hR执行1.3.1节描述的工作负载,每个CPU按最大频率运行,结果为::h]hQ执行1.3.1节描述的工作负载,每个CPU按最大频率运行,结果为:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKehj&hhubjU)}(hXCPU0 work ^ | ____ ____ ____ | | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time workload on CPU1 CPU1 work ^ | ______________ ______________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> timeh]hXCPU0 work ^ | ____ ____ ____ | | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time workload on CPU1 CPU1 work ^ | ______________ ______________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time}hjsbah}(h]h ]h"]h$]h&]hhuh1jThhhKghj&hhubeh}(h]id6ah ]h"]!1.3.2 最大操作性能值不同ah$]h&]uh1jhj!hhhhhKXubeh}(h]id4ah ]h"]1.3 平台示例ah$]h&]uh1jhjhhhhhK6ubj)}(hhh](j)}(h%1.4 关于计算方式的注意事项h]h%1.4 关于计算方式的注意事项}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKsubh)}(hX4需要注意的是,使用单一值来表示CPU性能的差异是有些争议的。两个不同的微架构的相对性能差异应该 描述为:X%整数运算差异,Y%浮点数运算差异,Z%分支跳转差异,等等。尽管如此,使用简单计算方式 的结果目前还是令人满意的。h]hX4需要注意的是,使用单一值来表示CPU性能的差异是有些争议的。两个不同的微架构的相对性能差异应该 描述为:X%整数运算差异,Y%浮点数运算差异,Z%分支跳转差异,等等。尽管如此,使用简单计算方式 的结果目前还是令人满意的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKuhjhhubeh}(h]id7ah ]h"]%1.4 关于计算方式的注意事项ah$]h&]uh1jhjhhhhhKsubeh}(h]cpuah ]h"] 1. cpu算力ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h2. 任务使用率h]h2. 任务使用率}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKzubj)}(hhh](j)}(h 2.1 简介h]h 2.1 简介}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/hhhhhK}ubh)}(h算力感知调度要求描述任务需求,描述方式要和CPU算力相关。每个调度类可以用不同的方式描述它。 任务使用率是CFS独有的描述方式,不过在这里介绍它有助于引入更多一般性的概念。h]h算力感知调度要求描述任务需求,描述方式要和CPU算力相关。每个调度类可以用不同的方式描述它。 任务使用率是CFS独有的描述方式,不过在这里介绍它有助于引入更多一般性的概念。}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj/hhubh)}(h任务使用率是一种用百分比来描述任务吞吐率需求的方式。一个简单的近似是任务的占空比,也就是说::h]h任务使用率是一种用百分比来描述任务吞吐率需求的方式。一个简单的近似是任务的占空比,也就是说:}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj/hhubjU)}(htask_util(p) = duty_cycle(p)h]htask_util(p) = duty_cycle(p)}hj\sbah}(h]h ]h"]h$]h&]hhuh1jThhhKhj/hhubh)}(h在频率固定的SMP系统中,100%的利用率意味着任务是忙等待循环。反之,10%的利用率暗示这是一个 小周期任务,它在睡眠上花费的时间比执行更多。h]h在频率固定的SMP系统中,100%的利用率意味着任务是忙等待循环。反之,10%的利用率暗示这是一个 小周期任务,它在睡眠上花费的时间比执行更多。}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj/hhubeh}(h]id9ah ]h"] 2.1 简介ah$]h&]uh1jhjhhhhhK}ubj)}(hhh](j)}(h2.2 频率不变性h]h2.2 频率不变性}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh)}(h一个需要考虑的议题是,工作负载的占空比受CPU正在运行的操作性能值直接影响。考虑以给定的频率F 执行周期性工作负载::h]h一个需要考虑的议题是,工作负载的占空比受CPU正在运行的操作性能值直接影响。考虑以给定的频率F 执行周期性工作负载:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjU)}(hCPU work ^ | ____ ____ ____ | | | | | | | +----+----+----+----+----+----+----+----+----+----+-> timeh]hCPU work ^ | ____ ____ ____ | | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time}hjsbah}(h]h ]h"]h$]h&]hhuh1jThhhKhjhhubh)}(h$可以算出 duty_cycle(p) == 25%。h]h$可以算出 duty_cycle(p) == 25%。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hB现在,考虑以给定频率F/2执行 *同一个* 工作负载::h](h(现在,考虑以给定频率F/2执行 }(hjhhhNhNubhemphasis)}(h *同一个*h]h 同一个}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 工作负载:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjU)}(hCPU work ^ | _________ _________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> timeh]hCPU work ^ | _________ _________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time}hjsbah}(h]h ]h"]h$]h&]hhuh1jThhhKhjhhubh)}(h可以算出 duty_cycle(p) == 50%,尽管两次执行中,任务的行为完全一致(也就是说,执行的工作量 相同)。h]h可以算出 duty_cycle(p) == 50%,尽管两次执行中,任务的行为完全一致(也就是说,执行的工作量 相同)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h任务利用率信号可按下面公式处理成频率不变的(译注:这里的术语用到了信号与系统的概念)::h]h任务利用率信号可按下面公式处理成频率不变的(译注:这里的术语用到了信号与系统的概念):}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjU)}(hRtask_util_freq_inv(p) = duty_cycle(p) * (curr_frequency(cpu) / max_frequency(cpu))h]hRtask_util_freq_inv(p) = duty_cycle(p) * (curr_frequency(cpu) / max_frequency(cpu))}hjsbah}(h]h ]h"]h$]h&]hhuh1jThhhKhjhhubh)}(h]对上面两个例子运用该公式,可以算出频率不变的任务利用率均为25%。h]h]对上面两个例子运用该公式,可以算出频率不变的任务利用率均为25%。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]id10ah ]h"]2.2 频率不变性ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h2.3 CPU不变性h]h2.3 CPU不变性}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+hhhhhKubh)}(hCPU算力与任务利用率具有类型的效应,在算力不同的CPU上执行完全相同的工作负载,将算出不同的 占空比。h]hCPU算力与任务利用率具有类型的效应,在算力不同的CPU上执行完全相同的工作负载,将算出不同的 占空比。}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj+hhubh)}(h.考虑1.3.2节提到的系统,也就是说::h]h-考虑1.3.2节提到的系统,也就是说:}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj+hhubjU)}(h+- capacity(CPU0) = C - capacity(CPU1) = C/3h]h+- capacity(CPU0) = C - capacity(CPU1) = C/3}hjXsbah}(h]h ]h"]h$]h&]hhuh1jThhhKhj+hhubh)}(hG每个CPU按最大频率执行指定周期性工作负载,结果为::h]hF每个CPU按最大频率执行指定周期性工作负载,结果为:}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj+hhubjU)}(hXCPU0 work ^ | ____ ____ ____ | | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time CPU1 work ^ | ______________ ______________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> timeh]hXCPU0 work ^ | ____ ____ ____ | | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time CPU1 work ^ | ______________ ______________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time}hjtsbah}(h]h ]h"]h$]h&]hhuh1jThhhKhj+hhubh)}(h也就是说,h]h也就是说,}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj+hhubj)}(hhh](j)}(hFduty_cycle(p) == 25%,如果任务p在CPU0上按最大频率运行。h]h)}(hjh]hFduty_cycle(p) == 25%,如果任务p在CPU0上按最大频率运行。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hGduty_cycle(p) == 75%,如果任务p在CPU1上按最大频率运行。 h]h)}(hFduty_cycle(p) == 75%,如果任务p在CPU1上按最大频率运行。h]hFduty_cycle(p) == 75%,如果任务p在CPU1上按最大频率运行。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]j6j7uh1jhhhKhj+hhubh)}(hD任务利用率信号可按下面公式处理成CPU算力不变的::h]hC任务利用率信号可按下面公式处理成CPU算力不变的:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj+hhubjU)}(hEtask_util_cpu_inv(p) = duty_cycle(p) * (capacity(cpu) / max_capacity)h]hEtask_util_cpu_inv(p) = duty_cycle(p) * (capacity(cpu) / max_capacity)}hjsbah}(h]h ]h"]h$]h&]hhuh1jThhhKhj+hhubh)}(h其中 ``max_capacity`` 是系统中最高的CPU算力。对上面的例子运用该公式,可以算出CPU算力不变 的任务利用率均为25%。h](h其中 }(hjhhhNhNubj)}(h``max_capacity``h]h max_capacity}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 是系统中最高的CPU算力。对上面的例子运用该公式,可以算出CPU算力不变 的任务利用率均为25%。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj+hhubeh}(h]id11ah ]h"]2.3 cpu不变性ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h2.4 任务利用率不变量h]h2.4 任务利用率不变量}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hhhhhKubh)}(h频率和CPU算力不变性都需要被应用到任务利用率的计算中,以便求出真正的不变信号。 任务利用率的伪计算公式是同时具备CPU和频率不变性的,也就是说,对于指定任务p::h]h频率和CPU算力不变性都需要被应用到任务利用率的计算中,以便求出真正的不变信号。 任务利用率的伪计算公式是同时具备CPU和频率不变性的,也就是说,对于指定任务p:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubjU)}(h curr_frequency(cpu) capacity(cpu) task_util_inv(p) = duty_cycle(p) * ------------------- * ------------- max_frequency(cpu) max_capacityh]h curr_frequency(cpu) capacity(cpu) task_util_inv(p) = duty_cycle(p) * ------------------- * ------------- max_frequency(cpu) max_capacity}hj+sbah}(h]h ]h"]h$]h&]hhuh1jThhhKhj hhubh)}(h也就是说,任务利用率不变量假定任务在系统中最高算力CPU上以最高频率运行,以此描述任务的行为。h]h也就是说,任务利用率不变量假定任务在系统中最高算力CPU上以最高频率运行,以此描述任务的行为。}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(hT在接下来的章节中提到的任何任务利用率,均是不变量的形式。h]hT在接下来的章节中提到的任何任务利用率,均是不变量的形式。}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]id12ah ]h"]2.4 任务利用率不变量ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h2.5 利用率估算h]h2.5 利用率估算}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]hhhhhKubh)}(hX@由于预测未来的水晶球不存在,当任务第一次变成可运行时,任务的行为和任务利用率均不能被准确预测。 CFS调度类基于实体负载跟踪机制(Per-Entity Load Tracking, PELT)维护了少量CPU和任务信号, 其中之一可以算出平均利用率(与瞬时相反)。h]hX@由于预测未来的水晶球不存在,当任务第一次变成可运行时,任务的行为和任务利用率均不能被准确预测。 CFS调度类基于实体负载跟踪机制(Per-Entity Load Tracking, PELT)维护了少量CPU和任务信号, 其中之一可以算出平均利用率(与瞬时相反)。}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj]hhubh)}(h这意味着,尽管运用“真实的”任务利用率(凭借水晶球)写出算力感知调度的准则,但是它的实现将只能 用任务利用率的估算值。h]h这意味着,尽管运用“真实的”任务利用率(凭借水晶球)写出算力感知调度的准则,但是它的实现将只能 用任务利用率的估算值。}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj]hhubeh}(h]id13ah ]h"]2.5 利用率估算ah$]h&]uh1jhjhhhhhKubeh}(h]id8ah ]h"]2. 任务使用率ah$]h&]uh1jhjhhhhhKzubj)}(hhh](j)}(h3. 算力感知调度的需求h]h3. 算力感知调度的需求}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h 3.1 CPU算力h]h 3.1 CPU算力}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh)}(h当前,Linux无法凭自身算出CPU算力,因此必须要有把这个信息传递给Linux的方式。每个架构必须为此 定义arch_scale_cpu_capacity()函数。h]h当前,Linux无法凭自身算出CPU算力,因此必须要有把这个信息传递给Linux的方式。每个架构必须为此 定义arch_scale_cpu_capacity()函数。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hX$arm、arm64和RISC-V架构直接把这个信息映射到arch_topology驱动的CPU scaling数据中(译注:参考 arch_topology.h的percpu变量cpu_scale),它是从capacity-dmips-mhz CPU binding中衍生计算 出来的。参见Documentation/devicetree/bindings/cpu/cpu-capacity.txt。h]hX$arm、arm64和RISC-V架构直接把这个信息映射到arch_topology驱动的CPU scaling数据中(译注:参考 arch_topology.h的percpu变量cpu_scale),它是从capacity-dmips-mhz CPU binding中衍生计算 出来的。参见Documentation/devicetree/bindings/cpu/cpu-capacity.txt。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]id15ah ]h"] 3.1 cpu算力ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h3.2 频率不变性h]h3.2 频率不变性}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh)}(h如2.2节所述,算力感知调度需要频率不变的任务利用率。每个架构必须为此定义 arch_scale_freq_capacity(cpu)函数。h]h如2.2节所述,算力感知调度需要频率不变的任务利用率。每个架构必须为此定义 arch_scale_freq_capacity(cpu)函数。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hX实现该函数要求计算出每个CPU当前以什么频率在运行。实现它的一种方式是利用硬件计数器(x86的 APERF/MPERF,arm64的AMU),它能按CPU当前频率动态可扩展地升降递增计数器的速率。另一种方式是 在cpufreq频率变化时直接使用钩子函数,内核此时感知到将要被切换的频率(也被arm/arm64实现了)。h]hX实现该函数要求计算出每个CPU当前以什么频率在运行。实现它的一种方式是利用硬件计数器(x86的 APERF/MPERF,arm64的AMU),它能按CPU当前频率动态可扩展地升降递增计数器的速率。另一种方式是 在cpufreq频率变化时直接使用钩子函数,内核此时感知到将要被切换的频率(也被arm/arm64实现了)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]id16ah ]h"]3.2 频率不变性ah$]h&]uh1jhjhhhhhKubeh}(h]id14ah ]h"]3. 算力感知调度的需求ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h4. 调度器拓扑结构h]h4. 调度器拓扑结构}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh)}(hl在构建调度域时,调度器将会发现系统是否表现为非对称CPU算力。如果是,那么:h]hl在构建调度域时,调度器将会发现系统是否表现为非对称CPU算力。如果是,那么:}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hhh](j)}(h;sched_asym_cpucapacity静态键(static key)将使能。h]h)}(hjAh]h;sched_asym_cpucapacity静态键(static key)将使能。}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj?ubah}(h]h ]h"]h$]h&]uh1jhj<hhhhhNubj)}(hSD_ASYM_CPUCAPACITY_FULL标志位将在尽量最低调度域层级中被设置,同时要满足条件:调度域恰好 完整包含某个CPU算力值的全部CPU。h]h)}(hSD_ASYM_CPUCAPACITY_FULL标志位将在尽量最低调度域层级中被设置,同时要满足条件:调度域恰好 完整包含某个CPU算力值的全部CPU。h]hSD_ASYM_CPUCAPACITY_FULL标志位将在尽量最低调度域层级中被设置,同时要满足条件:调度域恰好 完整包含某个CPU算力值的全部CPU。}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjVubah}(h]h ]h"]h$]h&]uh1jhj<hhhhhNubj)}(hSSD_ASYM_CPUCAPACITY标志将在所有包含非对称CPU的调度域中被设置。 h]h)}(hRSD_ASYM_CPUCAPACITY标志将在所有包含非对称CPU的调度域中被设置。h]hRSD_ASYM_CPUCAPACITY标志将在所有包含非对称CPU的调度域中被设置。}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjnubah}(h]h ]h"]h$]h&]uh1jhj<hhhhhNubeh}(h]h ]h"]h$]h&]j6j7uh1jhhhKhjhhubh)}(hsched_asym_cpucapacity静态键的设计意图是,保护为非对称CPU算力系统所准备的代码。不过要注意的 是,这个键是系统范围可见的。想象下面使用了cpuset的步骤::h]hsched_asym_cpucapacity静态键的设计意图是,保护为非对称CPU算力系统所准备的代码。不过要注意的 是,这个键是系统范围可见的。想象下面使用了cpuset的步骤:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubjU)}(hcapacity C/2 C ________ ________ / \ / \ CPUs 0 1 2 3 4 5 6 7 \__/ \______________/ cpusets cs0 cs1h]hcapacity C/2 C ________ ________ / \ / \ CPUs 0 1 2 3 4 5 6 7 \__/ \______________/ cpusets cs0 cs1}hjsbah}(h]h ]h"]h$]h&]hhuh1jThhhMhjhhubh)}(h$可以通过下面的方式创建:h]h$可以通过下面的方式创建:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjhhubjU)}(hX:mkdir /sys/fs/cgroup/cpuset/cs0 echo 0-1 > /sys/fs/cgroup/cpuset/cs0/cpuset.cpus echo 0 > /sys/fs/cgroup/cpuset/cs0/cpuset.mems mkdir /sys/fs/cgroup/cpuset/cs1 echo 2-7 > /sys/fs/cgroup/cpuset/cs1/cpuset.cpus echo 0 > /sys/fs/cgroup/cpuset/cs1/cpuset.mems echo 0 > /sys/fs/cgroup/cpuset/cpuset.sched_load_balanceh]hX:mkdir /sys/fs/cgroup/cpuset/cs0 echo 0-1 > /sys/fs/cgroup/cpuset/cs0/cpuset.cpus echo 0 > /sys/fs/cgroup/cpuset/cs0/cpuset.mems mkdir /sys/fs/cgroup/cpuset/cs1 echo 2-7 > /sys/fs/cgroup/cpuset/cs1/cpuset.cpus echo 0 > /sys/fs/cgroup/cpuset/cs1/cpuset.mems echo 0 > /sys/fs/cgroup/cpuset/cpuset.sched_load_balance}hjsbah}(h]h ]h"]h$]h&]hhforcelanguageshhighlight_args}uh1jThhhMhjhhubh)}(hX由于“这是”非对称CPU算力系统,sched_asym_cpucapacity静态键将使能。然而,CPU 0--1对应的 调度域层级,算力值仅有一个,该层级中SD_ASYM_CPUCAPACITY未被设置,它描述的是一个SMP区域,也 应该被以此处理。h]hX由于“这是”非对称CPU算力系统,sched_asym_cpucapacity静态键将使能。然而,CPU 0--1对应的 调度域层级,算力值仅有一个,该层级中SD_ASYM_CPUCAPACITY未被设置,它描述的是一个SMP区域,也 应该被以此处理。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hQ因此,“典型的”保护非对称CPU算力代码路径的代码模式是:h]hQ因此,“典型的”保护非对称CPU算力代码路径的代码模式是:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(hhh](j)}(h%检查sched_asym_cpucapacity静态键h]h)}(hjh]h%检查sched_asym_cpucapacity静态键}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h\如果它被使能,接着检查调度域层级中SD_ASYM_CPUCAPACITY标志位是否出现 h]h)}(h[如果它被使能,接着检查调度域层级中SD_ASYM_CPUCAPACITY标志位是否出现h]h[如果它被使能,接着检查调度域层级中SD_ASYM_CPUCAPACITY标志位是否出现}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM!hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]j6j7uh1jhhhM hjhhubeh}(h]id17ah ]h"]4. 调度器拓扑结构ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h5. 算力感知调度的实现h]h5. 算力感知调度的实现}(hj( hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj% hhhhhM$ubj)}(hhh](j)}(h5.1 CFSh]h5.1 CFS}(hj9 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6 hhhhhM'ubj)}(hhh](j)}(h"5.1.1 算力适应性(fitness)h]h"5.1.1 算力适应性(fitness)}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG hhhhhM*ubh)}(h&CFS最主要的算力调度准则是::h]h%CFS最主要的算力调度准则是:}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM,hjG hhubjU)}(h$task_util(p) < capacity(task_cpu(p))h]h$task_util(p) < capacity(task_cpu(p))}hjf sbah}(h]h ]h"]h$]h&]hhuh1jThhhM.hjG hhubh)}(h它通常被称为算力适应性准则。也就是说,CFS必须保证任务“适合”在某个CPU上运行。如果准则被违反, 任务将要更长地消耗该CPU,任务是CPU受限的(CPU-bound)。h]h它通常被称为算力适应性准则。也就是说,CFS必须保证任务“适合”在某个CPU上运行。如果准则被违反, 任务将要更长地消耗该CPU,任务是CPU受限的(CPU-bound)。}(hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM0hjG hhubh)}(hX此外,uclamp允许用户空间指定任务的最小和最大利用率,要么以sched_setattr()的方式,要么以 cgroup接口的方式(参阅Documentation/admin-guide/cgroup-v2.rst)。如其名字所暗示,uclamp 可以被用在前一条准则中限制task_util()。h]hX此外,uclamp允许用户空间指定任务的最小和最大利用率,要么以sched_setattr()的方式,要么以 cgroup接口的方式(参阅Documentation/admin-guide/cgroup-v2.rst)。如其名字所暗示,uclamp 可以被用在前一条准则中限制task_util()。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM3hjG hhubeh}(h]fitnessah ]h"]"5.1.1 算力适应性(fitness)ah$]h&]uh1jhj6 hhhhhM*ubj)}(hhh](j)}(h!5.1.2 被唤醒任务的CPU选择h]h!5.1.2 被唤醒任务的CPU选择}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hhhhhM8ubh)}(hXCFS任务唤醒的CPU选择,遵循上面描述的算力适应性准则。在此之上,uclamp被用来限制任务利用率, 这令用户空间对CFS任务的CPU选择有更多的控制。也就是说,CFS被唤醒任务的CPU选择,搜索满足以下 条件的CPU::h]hXCFS任务唤醒的CPU选择,遵循上面描述的算力适应性准则。在此之上,uclamp被用来限制任务利用率, 这令用户空间对CFS任务的CPU选择有更多的控制。也就是说,CFS被唤醒任务的CPU选择,搜索满足以下 条件的CPU:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM:hj hhubjU)}(hKclamp(task_util(p), task_uclamp_min(p), task_uclamp_max(p)) < capacity(cpu)h]hKclamp(task_util(p), task_uclamp_min(p), task_uclamp_max(p)) < capacity(cpu)}hj sbah}(h]h ]h"]h$]h&]hhuh1jThhhM>hj hhubh)}(hX7通过使用uclamp,举例来说,用户空间可以允许忙等待循环(100%使用率)在任意CPU上运行,只要给 它设置低的uclamp.max值。相反,uclamp能强制一个小的周期性任务(比如,10%利用率)在最高性能 的CPU上运行,只要给它设置高的uclamp.min值。h]hX7通过使用uclamp,举例来说,用户空间可以允许忙等待循环(100%使用率)在任意CPU上运行,只要给 它设置低的uclamp.max值。相反,uclamp能强制一个小的周期性任务(比如,10%利用率)在最高性能 的CPU上运行,只要给它设置高的uclamp.min值。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM@hj hhubh)}(hCFS的被唤醒的任务的CPU选择,可被能耗感知调度(Energy Aware Scheduling,EAS)覆盖,在 Documentation/scheduler/sched-energy.rst中描述。h]h)}(hCFS的被唤醒的任务的CPU选择,可被能耗感知调度(Energy Aware Scheduling,EAS)覆盖,在 Documentation/scheduler/sched-energy.rst中描述。h]hCFS的被唤醒的任务的CPU选择,可被能耗感知调度(Energy Aware Scheduling,EAS)覆盖,在 Documentation/scheduler/sched-energy.rst中描述。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMFhj ubah}(h]h ]h"]h$]h&]uh1hhj hhhhhNubeh}(h]id19ah ]h"]!5.1.2 被唤醒任务的cpu选择ah$]h&]uh1jhj6 hhhhhM8ubj)}(hhh](j)}(h5.1.3 负载均衡h]h5.1.3 负载均衡}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hhhhhMJubh)}(h}被唤醒任务的CPU选择的一个病理性的例子是,任务几乎不睡眠,那么也几乎不发生唤醒。考虑::h]h|被唤醒任务的CPU选择的一个病理性的例子是,任务几乎不睡眠,那么也几乎不发生唤醒。考虑:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMLhj hhubjU)}(hX3w == wakeup event capacity(CPU0) = C capacity(CPU1) = C / 3 workload on CPU0 CPU work ^ | _________ _________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time w w w workload on CPU1 CPU work ^ | ____________________________________________ | | +----+----+----+----+----+----+----+----+----+----+-> wh]hX3w == wakeup event capacity(CPU0) = C capacity(CPU1) = C / 3 workload on CPU0 CPU work ^ | _________ _________ ____ | | | | | | +----+----+----+----+----+----+----+----+----+----+-> time w w w workload on CPU1 CPU work ^ | ____________________________________________ | | +----+----+----+----+----+----+----+----+----+----+-> w}hj sbah}(h]h ]h"]h$]h&]hhuh1jThhhMNhj hhubh)}(hU该工作负载应该在CPU0上运行,不过如果任务满足以下条件之一:h]hU该工作负载应该在CPU0上运行,不过如果任务满足以下条件之一:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMahj hhubj)}(hhh](j)}(hH一开始发生不合适的调度(不准确的初始利用率估计)h]h)}(hj3 h]hH一开始发生不合适的调度(不准确的初始利用率估计)}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMchj1 ubah}(h]h ]h"]h$]h&]uh1jhj. hhhhhNubj)}(h@一开始调度正确,但突然需要更多的处理器功率 h]h)}(h?一开始调度正确,但突然需要更多的处理器功率h]h?一开始调度正确,但突然需要更多的处理器功率}(hjL hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMdhjH ubah}(h]h ]h"]h$]h&]uh1jhj. hhhhhNubeh}(h]h ]h"]h$]h&]j6j7uh1jhhhMchj hhubh)}(h则任务可能变为CPU受限的,也就是说 ``task_util(p) > capacity(task_cpu(p))`` ;CPU算力 调度准则被违反,将不会有任何唤醒事件来修复这个错误的CPU选择。h](h1则任务可能变为CPU受限的,也就是说 }(hjf hhhNhNubj)}(h(``task_util(p) > capacity(task_cpu(p))``h]h$task_util(p) > capacity(task_cpu(p))}(hjn hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjf ubhh ;CPU算力 调度准则被违反,将不会有任何唤醒事件来修复这个错误的CPU选择。}(hjf hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMfhj hhubh)}(hX这种场景下的任务被称为“不合适的”(misfit)任务,处理这个场景的机制同样也以此命名。Misfit 任务迁移借助CFS负载均衡器,更明确的说,是主动负载均衡的部分(用来迁移正在运行的任务)。 当发生负载均衡时,如果一个misfit任务可以被迁移到一个相较当前运行的CPU具有更高算力的CPU上, 那么misfit任务的主动负载均衡将被触发。h]hX这种场景下的任务被称为“不合适的”(misfit)任务,处理这个场景的机制同样也以此命名。Misfit 任务迁移借助CFS负载均衡器,更明确的说,是主动负载均衡的部分(用来迁移正在运行的任务)。 当发生负载均衡时,如果一个misfit任务可以被迁移到一个相较当前运行的CPU具有更高算力的CPU上, 那么misfit任务的主动负载均衡将被触发。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMihj hhubeh}(h]id20ah ]h"]5.1.3 负载均衡ah$]h&]uh1jhj6 hhhhhMJubeh}(h]cfsah ]h"]5.1 cfsah$]h&]uh1jhj% hhhhhM'ubj)}(hhh](j)}(h5.2 实时调度h]h5.2 实时调度}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hhhhhMoubj)}(hhh](j)}(h!5.2.1 被唤醒任务的CPU选择h]h!5.2.1 被唤醒任务的CPU选择}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hhhhhMrubh)}(hD实时任务唤醒时的CPU选择,搜索满足以下条件的CPU::h]hC实时任务唤醒时的CPU选择,搜索满足以下条件的CPU:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMthj hhubjU)}(h-task_uclamp_min(p) <= capacity(task_cpu(cpu))h]h-task_uclamp_min(p) <= capacity(task_cpu(cpu))}hj sbah}(h]h ]h"]h$]h&]hhuh1jThhhMvhj hhubh)}(h同时仍然允许接着使用常规的优先级限制。如果没有CPU能满足这个算力准则,那么将使用基于严格 优先级的调度,CPU算力将被忽略。h]h同时仍然允许接着使用常规的优先级限制。如果没有CPU能满足这个算力准则,那么将使用基于严格 优先级的调度,CPU算力将被忽略。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMxhj hhubeh}(h]id22ah ]h"]!5.2.1 被唤醒任务的cpu选择ah$]h&]uh1jhj hhhhhMrubeh}(h]id21ah ]h"]5.2 实时调度ah$]h&]uh1jhj% hhhhhMoubj)}(hhh](j)}(h5.3 最后期限调度h]h5.3 最后期限调度}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hhhhhM|ubj)}(hhh](j)}(h!5.3.1 被唤醒任务的CPU选择h]h!5.3.1 被唤醒任务的CPU选择}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hhhhhMubh)}(hJ最后期限任务唤醒时的CPU选择,搜索满足以下条件的CPU::h]hI最后期限任务唤醒时的CPU选择,搜索满足以下条件的CPU:}(hj" hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubjU)}(h)task_bandwidth(p) < capacity(task_cpu(p))h]h)task_bandwidth(p) < capacity(task_cpu(p))}hj0 sbah}(h]h ]h"]h$]h&]hhuh1jThhhMhj hhubh)}(h同时仍然允许接着使用常规的带宽和截止期限限制。如果没有CPU能满足这个算力准则,那么任务依然 在当前CPU队列中。h]h同时仍然允许接着使用常规的带宽和截止期限限制。如果没有CPU能满足这个算力准则,那么任务依然 在当前CPU队列中。}(hj> hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubeh}(h]id24ah ]h"]!5.3.1 被唤醒任务的cpu选择ah$]h&]uh1jhj hhhhhMubeh}(h]id23ah ]h"]5.3 最后期限调度ah$]h&]uh1jhj% hhhhhM|ubeh}(h]id18ah ]h"]5. 算力感知调度的实现ah$]h&]uh1jhjhhhhhM$ubeh}(h]id1ah ]h"]算力感知调度ah$]h&]uh1jhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(ji jf jjjijfjjjjj#j jjjjjjj}jzj(j%j jjZjWjjjjjjjjj" j ja j^ j j j j j j j j j j j j jY jV jQ jN u nametypes}(ji jjijjj#jjjj}j(j jZjjjjj" ja j j j j j j jY jQ uh}(jf jjjjfjjjljj!j j2jj&jjjjjzj/j%jjj+jWj jj]jjjjjjj jj^ j% j j6 j jG j j j j j j j j jV j jN j u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j KsRparse_messages]transform_messages] transformerN include_log]=Documentation/translations/zh_CN/scheduler/sched-capacity.rst(NNNNta decorationNhhub.