1.. include:: ../disclaimer-sp.rst 2 3:Original: :ref:`Documentation/scheduler/sched-design-CFS.rst <sched_design_CFS>` 4:Translator: Sergio González Collado <sergio.collado@gmail.com> 5 6.. _sp_sched_bwc: 7 8================================= 9CFS con control de ancho de banda 10================================= 11 12.. note:: 13 Este documento únicamente trata el control de ancho de banda de CPUs 14 para SCHED_NORMAL. El caso de SCHED_RT se trata en Documentation/scheduler/sched-rt-group.rst 15 16El control de ancho de banda es una extensión CONFIG_FAIR_GROUP_SCHED que 17permite especificar el máximo uso disponible de CPU para un grupo o una jerarquía. 18 19El ancho de banda permitido para un grupo de tareas se especifica usando una 20cuota y un periodo. Dentro de un "periodo" (microsegundos), a un grupo 21de tareas se le asigna hasta su "cuota" de tiempo de uso de CPU en 22microsegundos. Esa cuota es asignada para cada CPU en colas de ejecución 23en porciones de tiempo de ejecución en la CPU según los hilos de ejecución 24del grupo de tareas van siendo candidatos a ejecutarse. Una vez toda la cuota 25ha sido asignada cualquier petición adicional de cuota resultará en esos hilos 26de ejecución siendo limitados/estrangulados. Los hilos de ejecución limitados 27no serán capaces de ejecutarse de nuevo hasta el siguiente periodo cuando 28la cuota sea restablecida. 29 30La cuota sin asignar de un grupo es monitorizada globalmente, siendo 31restablecidas cfs_quota unidades al final de cada periodo. Según los 32hilos de ejecución van consumiendo este ancho de banda, este se 33transfiere a los "silos" de las cpu-locales en base a la demanda. La 34cantidad transferida en cada una de esas actualizaciones es ajustable y 35es descrito como un "slice". 36 37Característica de ráfaga 38-------------------------- 39 40Esta característica toma prestado tiempo ahora, que en un futuro tendrá que 41devolver, con el coste de una mayor interferencia hacia los otros usuarios 42del sistema. Todo acotado perfectamente. 43 44El tradicional control de ancho de banda (UP-EDF) es algo como: 45 46 (U = \Sum u_i) <= 1 47 48Esto garantiza dos cosas: que cada tiempo límite de ejecución es cumplido 49y que el sistema es estable. De todas formas, si U fuese > 1, entonces 50por cada segundo de tiempo de reloj de una tarea, tendríamos que 51ejecutar más de un segundo y obviamente no se cumpliría con el tiempo 52límite de ejecución de la tarea, pero en el siguiente periodo de ejecución 53el tiempo límite de la tarea estaría todavía más lejos, y nunca se tendría 54tiempo de alcanzar la ejecución, cayendo así en un fallo no acotado. 55 56La característica de ráfaga implica que el trabajo de una tarea no siempre 57consuma totalmente la cuota; esto permite que se pueda describir u_i 58como una distribución estadística. 59 60Por ejemplo, se tiene u_i = {x,e}_i, donde x es el p(95) y x+e p(100) 61(el tradicional WCET (WCET:Worst Case Execution Time: son las siglas 62en inglés para "peor tiempo de ejecución")). Esto efectivamente permite 63a u ser más pequeño, aumentando la eficiencia (podemos ejecutar más 64tareas en el sistema), pero al coste de perder el instante límite de 65finalización deseado de la tarea, cuando coincidan las peores 66probabilidades. De todas formas, si se mantiene la estabilidad, ya que 67cada sobre-ejecución se empareja con una infra-ejecución en tanto x esté 68por encima de la media. 69 70Es decir, supóngase que se tienen 2 tareas, ambas específicamente 71con p(95), entonces tenemos p(95)*p(95) = 90.25% de probabilidad de 72que ambas tareas se ejecuten dentro de su cuota asignada y todo 73salga bien. Al mismo tiempo se tiene que p(5)*p(5) = 0.25% de 74probabilidad que ambas tareas excedan su cuota de ejecución (fallo 75garantizado de su tiempo final de ejecución). En algún punto por 76en medio, hay un umbral donde una tarea excede su tiempo límite de 77ejecución y la otra no, de forma que se compensan; esto depende de la 78función de probabilidad acumulada específica de la tarea. 79 80Al mismo tiempo, se puede decir que el peor caso de sobrepasar el 81tiempo límite de ejecución será \Sum e_i; esto es una retraso acotado 82(asumiendo que x+e es de hecho el WCET). 83 84La interferencia cuando se usa una ráfaga se evalúa por las posibilidades 85de fallar en el cumplimiento del tiempo límite y el promedio de WCET. 86Los resultados de los tests han mostrado que cuando hay muchos cgroups o 87una CPU está infrautilizada, la interferencia es más limitada. Más detalles 88se aportan en: https://lore.kernel.org/lkml/5371BD36-55AE-4F71-B9D7-B86DC32E3D2B@linux.alibaba.com/ 89 90Gestión: 91-------- 92 93Cuota, periodo y ráfaga se gestionan dentro del subsistema de cpu por medio 94de cgroupfs. 95 96.. note:: 97 Los archivos cgroupfs descritos en esta sección solo se aplican al cgroup 98 v1. Para cgroup v2, ver :ref:`Documentation/admin-guide/cgroup-v2.rst <cgroup-v2-cpu>`. 99 100- cpu.cfs_quota_us: tiempo de ejecución que se refresca cada periodo (en microsegundos) 101- cpu.cfs_period_us: la duración del periodo (en microsegundos) 102- cpu.stat: exporta las estadísticas de limitación [explicado a continuación] 103- cpu.cfs_burst_us: el máximo tiempo de ejecución acumulado (en microsegundos) 104 105Los valores por defecto son:: 106 107 cpu.cfs_period_us=100ms 108 cpu.cfs_quota_us=-1 109 cpu.cfs_burst_us=0 110 111Un valor de -1 para cpu.cfs_quota_us indica que el grupo no tiene ninguna 112restricción de ancho de banda aplicado, ese grupo se describe como un grupo 113con ancho de banda sin restringir. Esto representa el comportamiento 114tradicional para CFS. 115 116Asignar cualquier valor (válido) y positivo no menor que cpu.cfs_burst_us 117definirá el límite del ancho de banda. La cuota mínima permitida para 118la cuota o periodo es 1ms. Hay también un límite superior en la duración del 119periodo de 1s. Existen restricciones adicionales cuando los límites de 120ancho de banda se usan de manera jerárquica, estos se explican en mayor 121detalle más adelante. 122 123Asignar cualquier valor negativo a cpu.cfs_quota_us eliminará el límite de 124ancho de banda y devolverá de nuevo al grupo a un estado sin restricciones. 125 126Un valor de 0 para cpu.cfs_burst_us indica que el grupo no puede acumular 127ningún ancho de banda sin usar. Esto hace que el control del comportamiento 128tradicional del ancho de banda para CFS no cambie. Definir cualquier valor 129(válido) positivo no mayor que cpu.cfs_quota_us en cpu.cgs_burst_us definirá 130el límite con el ancho de banda acumulado no usado. 131 132Cualquier actualización a las especificaciones del ancho de banda usado 133por un grupo resultará en que se deje de limitar si está en un estado 134restringido. 135 136Ajustes globales del sistema 137---------------------------- 138 139Por eficiencia el tiempo de ejecución es transferido en lotes desde una reserva 140global y el "silo" de una CPU local. Esto reduce en gran medida la presión 141por la contabilidad en grandes sistemas. La cantidad transferida cada vez 142que se requiere una actualización se describe como "slice". 143 144Esto es ajustable vía procfs:: 145 146 /proc/sys/kernel/sched_cfs_bandwidth_slice_us (valor por defecto=5ms) 147 148Valores de "slice" más grandes reducirán el costo de transferencia, mientras 149que valores más pequeños permitirán un control más fino del consumo. 150 151Estadísticas 152------------ 153 154Las estadísticas del ancho de banda de un grupo se exponen en 5 campos en cpu.stat. 155 156cpu.stat: 157 158- nr_periods: Número de intervalos aplicados que han pasado. 159- nr_throttled: Número de veces que el grupo ha sido restringido/limitado. 160- throttled_time: La duración de tiempo total (en nanosegundos) en las 161 que las entidades del grupo han sido limitadas. 162- nr_bursts: Número de periodos en que ha ocurrido una ráfaga. 163- burst_time: Tiempo acumulado (en nanosegundos) en la que una CPU ha 164 usado más de su cuota en los respectivos periodos. 165 166Este interfaz es de solo lectura. 167 168Consideraciones jerárquicas 169--------------------------- 170 171La interfaz refuerza que el ancho de banda de una entidad individual 172sea siempre factible, esto es: max(c_i) <= C. De todas maneras, 173la sobre-suscripción en el caso agregado está explícitamente permitida 174para hacer posible semánticas de conservación de trabajo dentro de una 175jerarquia. 176 177 e.g. \Sum (c_i) puede superar C 178 179[ Donde C es el ancho de banda de el padre, y c_i el de su hijo ] 180 181Hay dos formas en las que un grupo puede ser limitado: 182 183 a. este consume totalmente su propia cuota en un periodo. 184 b. la cuota del padre es consumida totalmente en su periodo. 185 186En el caso b) anterior, incluso si el hijo pudiera tener tiempo de 187ejecución restante, este no le será permitido hasta que el tiempo de 188ejecución del padre sea actualizado. 189 190Advertencias sobre el CFS con control de cuota de ancho de banda 191---------------------------------------------------------------- 192 193Una vez una "slice" se asigna a una cpu esta no expira. A pesar de eso todas, 194excepto las "slices" menos las de 1ms, puede ser devueltas a la reserva global 195si todos los hilos en esa cpu pasan a ser no ejecutables. Esto se configura 196en el tiempo de compilación por la variable min_cfs_rq_runtime. Esto es un 197ajuste en la eficacia que ayuda a prevenir añadir bloqueos en el candado global. 198 199El hecho de que las "slices" de una cpu local no expiren tiene como resultado 200algunos casos extremos interesantes que debieran ser comprendidos. 201 202Para una aplicación que es un cgroup y que está limitada en su uso de cpu 203es un punto discutible ya que de forma natural consumirá toda su parte 204de cuota así como también la totalidad de su cuota en cpu locales en cada 205periodo. Como resultado se espera que nr_periods sea aproximadamente igual 206a nr_throttled, y que cpuacct.usage se incremente aproximadamente igual 207a cfs_quota_us en cada periodo. 208 209Para aplicaciones que tienen un gran número de hilos de ejecución y que no 210estan ligadas a una cpu, este matiz de la no-expiración permite que las 211aplicaciones brevemente sobrepasen su cuota límite en la cantidad que 212no ha sido usada en cada cpu en la que el grupo de tareas se está ejecutando 213(típicamente como mucho 1ms por cada cpu o lo que se ha definido como 214min_cfs_rq_runtime). Este pequeño sobreuso únicamente tiene lugar si 215la cuota que ha sido asignada a una cpu y no ha sido completamente usada 216o devuelta en periodos anteriores. Esta cantidad de sobreuso no será 217transferida entre núcleos. Como resultado, este mecanismo todavía cumplirá 218estrictamente los límites de la tarea de grupo en el promedio del uso, 219pero sobre una ventana de tiempo mayor que un único periodo. Esto 220también limita la habilidad de un sobreuso a no más de 1ms por cada cpu. 221Esto provee de una experiencia de uso más predecible para aplicaciones 222con muchos hilos y con límites de cuota pequeños en máquinas con muchos 223núcleos. Esto también elimina la propensión a limitar estas 224aplicaciones mientras que simultáneamente usan menores cuotas 225de uso por cpu. Otra forma de decir esto es que permitiendo que 226la parte no usada de una "slice" permanezca válida entre periodos 227disminuye la posibilidad de malgastare cuota que va a expirar en 228las reservas de la cpu locales que no necesitan una "slice" completa 229de tiempo de ejecución de cpu. 230 231La interacción entre las aplicaciones ligadas a una CPU y las que no están 232ligadas a ninguna cpu ha de ser también considerada, especialmente cuando 233un único núcleo tiene un uso del 100%. Si se da a cada una de esas 234aplicaciones la mitad de la capacidad de una CPU-núcleo y ambas 235están gestionadas en la misma CPU es teóricamente posible que la aplicación 236no ligada a ninguna CPU use su 1ms adicional de cuota en algunos periodos, 237y por tanto evite que la aplicación ligada a una CPU pueda usar su 238cuota completa por esa misma cantidad. En esos caso el algoritmo CFS (vea 239sched-design-CFS.rst) el que decida qué aplicación es la elegida para 240ejecutarse, ya que ambas serán candidatas a ser ejecutadas y tienen 241cuota restante. Esta discrepancia en el tiempo de ejecución se compensará 242en los periodos siguientes cuando el sistema esté inactivo. 243 244Ejemplos 245--------- 246 2471. Un grupo limitado a 1 CPU de tiempo de ejecución. 248 249 Si el periodo son 250ms y la cuota son 250ms el grupo de tareas tendrá el tiempo 250 de ejecución de 1 CPU cada 250ms:: 251 252 # echo 250000 > cpu.cfs_quota_us /* cuota = 250ms */ 253 # echo 250000 > cpu.cfs_period_us /* periodo = 250ms */ 254 2552. Un grupo limitado al tiempo de ejecución de 2 CPUs en una máquina varias CPUs. 256 257 Con un periodo de 500ms y una cuota de 1000ms el grupo de tareas tiene el tiempo 258 de ejecución de 2 CPUs cada 500ms:: 259 260 # echo 1000000 > cpu.cfs_quota_us /* cuota = 1000ms */ 261 # echo 500000 > cpu.cfs_period_us /* periodo = 500ms */ 262 263 El periodo más largo aquí permite una capacidad de ráfaga mayor. 264 2653. Un grupo limitado a un 20% de 1 CPU. 266 267 Con un periodo de 50ms, 10ms de cuota son equivalentes al 20% de 1 CPUs:: 268 269 # echo 10000 > cpu.cfs_quota_us /* cuota = 10ms */ 270 # echo 50000 > cpu.cfs_period_us /* periodo = 50ms */ 271 272 Usando un periodo pequeño aquí nos aseguramos una respuesta de 273 la latencia consistente a expensas de capacidad de ráfaga. 274 2754. Un grupo limitado al 40% de 1 CPU, y permite acumular adicionalmente 276 hasta un 20% de 1 CPU. 277 278 Con un periodo de 50ms, 20ms de cuota son equivalentes al 40% de 279 1 CPU. Y 10ms de ráfaga, son equivalentes a un 20% de 1 CPU:: 280 281 # echo 20000 > cpu.cfs_quota_us /* cuota = 20ms */ 282 # echo 50000 > cpu.cfs_period_us /* periodo = 50ms */ 283 # echo 10000 > cpu.cfs_burst_us /* ráfaga = 10ms */ 284 285 Un ajuste mayor en la capacidad de almacenamiento (no mayor que la cuota) 286 permite una mayor capacidad de ráfaga. 287 288