1 .. include:: ../disclaimer-zh_CN.rst 2 3 :Original: Documentation/scheduler/sched-bwc.r 4 5 :翻译: 6 7 司延腾 Yanteng Si <siyanteng@loongson.cn> 8 9 :校译: 10 11 12 13 ============ 14 CFS 带宽控制 15 ============ 16 17 .. note:: 18 本文只讨论了SCHED_NORMAL的CPU带宽 19 SCHED_RT的情况在Documentation/scheduler 20 21 CFS带宽控制是一个CONFIG_FAIR_GROUP_SCHE 22 23 一个组允许的带宽是用配额和周期 24 达“配额”微秒的CPU时间。当cgroup 25 运行队列中。一旦所有的配额被分 26 能再次运行,直到下一个时期的配 27 28 一个组的未分配配额是全局跟踪的 29 它以需求为基础被转移到cpu-local“ 30 间片)。 31 32 突发特性 33 -------- 34 现在这个功能借来的时间是用于防 35 有很好的限制。 36 37 传统的(UP-EDF)带宽控制是这样的: 38 39 (U = \Sum u_i) <= 1 40 41 这既保证了每个最后期限的实现, 42 们就必须运行超过一秒钟的程序时 43 时间赶上,无边无界的失败。 44 45 突发特性观察到工作负载并不总是 46 47 例如,让u_i = {x,e}_i,其中x是p(95)和 48 高了效率(我们可以在系统中打包 49 而,它确实保持了稳定性,因为只 50 51 也就是说,假设我们有两个任务, 52 会,两个任务都在他们的配额内, 53 时超过他们的配额(保证最后期限 54 无法补偿;这取决于具体的CDFs。 55 56 同时,我们可以说,最坏的情况下 57 设x+e确实是WCET的情况下)。 58 59 使用突发时的干扰是由错过最后期 60 CPU未被充分利用时,干扰是有限的 61 https://lore.kernel.org/lkml/5371BD36-55AE-4F7 62 63 管理 64 ---- 65 配额、周期和突发是在cpu子系统内 66 67 .. note:: 68 本节描述的cgroupfs文件只适用于cg 69 :ref:`Documentation/admin-guide/cgroup-v2.r 70 71 - cpu.cfs_quota_us:在一个时期内补充 72 - cpu.cfs_period_us:一个周期的长度( 73 - cpu.stat: 输出节流统计数据[下面进 74 - cpu.cfs_burst_us:最大累积运行时间 75 76 默认值是:: 77 78 cpu.cfs_period_us=100ms 79 cpu.cfs_quota_us=-1 80 cpu.cfs_burst_us=0 81 82 cpu.cfs_quota_us的值为-1表示该组没有 83 了CFS的传统工作保护行为。 84 85 写入不小于cpu.cfs_burst_us的任何(有 86 小配额是1ms。周期长度也有一个1s 87 面有更详细的解释。 88 89 向cpu.cfs_quota_us写入任何负值都会移 90 91 cpu.cfs_burst_us的值为0表示该组不能 92 改变。将不大于 cpu.cfs_quota_us 的任 93 带宽累积的上限。 94 95 如果一个组处于受限状态,对该组 96 97 系统范围设置 98 ------------ 99 为了提高效率,运行时间在全局池 100 局核算压力。每次需要进行这种更 101 102 这是可以通过procfs调整的:: 103 104 /proc/sys/kernel/sched_cfs_bandwidth_s 105 106 较大的时间片段值将减少传输开销 107 108 统计 109 ---- 110 一个组的带宽统计数据通过cpu.stat 111 112 cpu.stat: 113 114 - nr_periods:已经过去的执行间隔的 115 - nr_throttled: 该组已被节流/限制的 116 - throttled_time: 该组的实体被限流的 117 - nr_bursts:突发发生的周期数。 118 - burst_time: 任何CPU在各个时期使用 119 120 这个接口是只读的。 121 122 分层考虑 123 -------- 124 该接口强制要求单个实体的带宽总 125 允许过度订阅的,以便在一个层次 126 127 例如,Sum (c_i)可能超过C 128 129 [ 其中C是父方的带宽,c_i是其子方 130 131 .. note:: 132 译文中的父亲/孩子指的是cgroup pa 133 134 有两种方式可以使一个组变得限流: 135 136 a. 它在一段时期内完全消耗 137 b. 父方的配额在其期间内全 138 139 在上述b)情况下,即使孩子可能有 140 141 CFS带宽配额的注意事项 142 --------------------- 143 一旦一个片断被分配给一个cpu,它 144 1ms以外的所有时间片都可以返回到 145 是一个性能调整,有助于防止对全 146 147 cpu-local分片不会过期的事实导致了 148 149 对于cgroup cpu限制的应用程序来说, 150 额,以及每个cpu-本地片在每个时期 151 cpuacct.用量的增加大致等于cfs_quota_u 152 153 对于高线程、非cpu绑定的应用程序 154 即任务组正在运行的每个cpu上未使 155 义)。这种轻微的突发只适用于配 156 量不会在核心之间转移。因此,这 157 长的时间窗口。这也限制了突发能 158 应用提供了更好的更可预测的用户 159 另一种说法是,通过允许一个片断 160 时间的cpu-local 筒仓上浪费配额的可 161 162 绑定cpu和非绑定cpu的交互式应用之 163 给了这些应用程序一半的cpu-core, 164 可能在某些时期使用多达1ms的额外 165 量。在这些情况下,将由CFS算法( 166 的,并且有剩余的配额。这个运行 167 168 例子 169 ---- 170 1. 限制一个组的运行时间为1个CPU的 171 172 如果周期是250ms,配额也是250 173 174 # echo 250000 > cpu.cfs_quota_us /* qu 175 # echo 250000 > cpu.cfs_period_us /* p 176 177 2. 在多CPU机器上,将一个组的运行 178 179 在500ms周期和1000ms配额的情况下 180 181 # echo 1000000 > cpu.cfs_quota_us /* q 182 # echo 500000 > cpu.cfs_period_us /* p 183 184 这里较大的周期允许增加突 185 186 3. 将一个组限制在1个CPU的20%。 187 188 在50ms周期内,10ms配额将相当于1 189 190 # echo 10000 > cpu.cfs_quota_us /* quo 191 # echo 50000 > cpu.cfs_period_us /* pe 192 193 通过在这里使用一个小的周期, 194 195 4. 将一个组限制在1个CPU的40%,并允 196 197 在50ms周期内,20ms配额将相当于1 198 CPU的20%:: 199 200 # echo 20000 > cpu.cfs_quota_us /* quo 201 # echo 50000 > cpu.cfs_period_us /* pe 202 # echo 10000 > cpu.cfs_burst_us /* bur 203 204 较大的缓冲区设置(不大于配额
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.