Por que o cpu.cfs_quota_us não limita a largura de banda da CPU do contêiner LXC?

3

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
  • kernel 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 têm valores padrão para todos os outros subsistemas do 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

Eu corri um estresse básico dentro e fora do contêiner ao mesmo tempo para obter um indicador de quantas operações por segundo estavam sendo permitidas dentro e por fora e os resultados eram basicamente o mesmo que correr com uma cota de "- 1 ", ou seja, sem cota.

Execução 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  

Execução 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 / s, estou obtendo 39%. Por que isso acontece? Não deveria ser limitado por cpu.cfs_quota_us ?

Obrigado pela ajuda antecipada.

    
por Andrew 23.09.2016 / 00:49

1 resposta

2

Queria postar a resposta para essa pergunta caso alguém veja um resultado confuso semelhante. Parece que eu tive dois problemas:

  • É necessário usar # CPUs no host, não # CPUs disponíveis no cgroups cpuset 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 de stress-ng dentro do contêiner estava usando os controladores cpu e cpuset do / lxc / foo cgroup enquanto a execução de stress-ng fora do contêiner estava usando o /system/sshd.service cgroup

Para modelar melhor meu aplicativo do mundo real, eu deveria ter especificado quais controles usar usando cgexec :

$ 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%)  
    
por 29.09.2016 / 22:13