
Me gustaría limitar el contenedor al 25% del ancho de banda total de la CPU del sistema.
Aquí está mi configuración:
- LXC versión 1.0.2
- núcleo 3.2.45
- un usuario creó cgroup (foo) para un contenedor LXC
- 40 núcleos disponibles en el host
- el host y el contenedor tienen valores predeterminados para todos los demás subsistemas de cgroup excepto:
/sys/fs/cgroup/cpu/lxc/foo/cpu.cfs_quota_us = 400000
/sys/fs/cgroup/cpu/lxc/foo/cpu.cfs_period_us = 100000
/sys/fs/cgroup/cpuset/lxc/foo/cpuset.cpus = 0-15
Calculé la cuota usando esta fórmula:
(# of cpus available to container) * (cpu.cfs_period_us) * (.25) so 16 * 100000 * .25 = 400000
Ejecuté un estrés básico dentro y fuera del contenedor al mismo tiempo para obtener una idea de cuántas operaciones por segundo se permitían dentro y fuera del contenedor y los resultados fueron básicamente los mismos que si se ejecutara con una cuota de "-1". es decir, sin cuota.
Carrera exterior:
$ ./stress-ng --cpu-load 50 -c 40 --timeout 20s --metrics-brief
stress-ng: info: [25649] dispatching hogs: 40 cpu
stress-ng: info: [25649] successful run completed in 20.44s
stress-ng: info: [25649] stressor bogo ops real time usr time sys time bogo ops/s bogo ops/s
stress-ng: info: [25649] (secs) (secs) (secs) (real time) (usr+sys time)
stress-ng: info: [25649] cpu 37348 20.18 380.56 0.58 1850.85 97.99
Carrera interior:
$ ./stress-ng --cpu-load 100 -c 16 --timeout 20s --metrics-brief
stress-ng: info: [34256] dispatching hogs: 16 cpu
stress-ng: info: [34256] successful run completed in 20.10s
stress-ng: info: [34256] stressor bogo ops real time usr time sys time bogo ops/s bogo ops/s
stress-ng: info: [34256] (secs) (secs) (secs) (real time) (usr+sys time)
stress-ng: info: [34256] cpu 24147 20.03 205.20 0.17 1205.67 117.58
Según las operaciones, obtengo el 39%. ¿Por qué pasó esto? ¿No debería estar limitado por cpu.cfs_quota_us
?
Gracias por la ayuda por adelantado.
Respuesta1
Quería publicar la respuesta a esta pregunta en caso de que alguien más vea un resultado confuso similar. Parece que tuve dos problemas:
Es necesario utilizar el número de CPU en el host, no el número de CPU disponibles en el cpuset de cgroups para estimar el ancho de banda de la CPU:
(# of cpus on the host) * (cpu.cfs_period_us) * (.25) so 40 * 100000 * .25 = 1000000
Mi ejecución de estrés-ng dentro del contenedor estaba usando los controladores cpu y cpuset del grupo c /lxc/foo mientras que la ejecución de estrés-ng fuera del contenedor estaba usando el grupo c /system/sshd.service
Para modelar mejor mi aplicación del mundo real, debería haber especificado qué controladores usar usandocgexec:
$ cgexec -g cpuset:/lxc/foo -g cpu:/lxc/foo ./stress-ng --cpu-load 100 -c 48 --times --timeout 10s --metrics-brief
stress-ng: info: [6252] dispatching hogs: 48 cpu
stress-ng: info: [6252] successful run completed in 10.36s
stress-ng: info: [6252] stressor bogo ops real time usr time sys time bogo ops/s bogo ops/s
stress-ng: info: [6252] (secs) (secs) (secs) (real time) (usr+sys time)
stress-ng: info: [6252] cpu 11152 10.09 102.83 0.12 1105.60 108.32
stress-ng: info: [6252] for a 10.36s run time:
stress-ng: info: [6252] 414.46s available CPU time
stress-ng: info: [6252] 102.85s user time ( 24.82%)
stress-ng: info: [6252] 0.12s system time ( 0.03%)
stress-ng: info: [6252] 102.97s total time ( 24.84%)