
Gostaria de limitar o contêiner a 25% da largura de banda total da CPU do sistema.
Aqui está minha configuração:
- LXC versão 1.0.2
- núcleo 3.2.45
- um usuário criou cgroup (foo) para um contêiner LXC
- 40 núcleos disponíveis no host
- o host e o contêiner possuem valores padrão para todos os outros subsistemas cgroup, exceto:
/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
Calculei a cota usando esta fórmula:
(# of cpus available to container) * (cpu.cfs_period_us) * (.25) so 16 * 100000 * .25 = 400000
Executei um estresse básico dentro e fora do contêiner ao mesmo tempo para ter uma ideia de quantas operações por segundo estavam sendo permitidas dentro e fora e os resultados foram basicamente os mesmos de executar com uma cota de "-1", o que significa que não há cota.
Corrida externa:
$ ./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
Corrida interna:
$ ./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
Com base nas operações, estou obtendo 39%. Por que isso acontece? Não deveria ser limitado por cpu.cfs_quota_us
?
Obrigado pela ajuda antecipadamente.
Responder1
Queria postar a resposta a esta pergunta caso alguém veja um resultado confuso semelhante. Parece que tive dois problemas:
É necessário usar # de CPUs no host, e não # CPUs disponíveis no cpuset do cgroups para estimar a largura de banda da CPU:
(# of cpus on the host) * (cpu.cfs_period_us) * (.25) so 40 * 100000 * .25 = 1000000
Minha execução do stress-ng dentro do contêiner estava usando os controladores cpu e cpuset do /lxc/foo cgroup enquanto a execução do stress-ng fora do contêiner estava usando o cgroup /system/sshd.service
Para modelar melhor minha aplicação no mundo real, eu deveria ter especificado quais 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%)