Memória do VirtualBox não refletida em seu cgroup

1

Eu estou tentando limitar a quantidade de memória que um usuário pode usar usando cgroups (usando o Ubuntu 16.04 com systemd).

Depois de definir a propriedade MemoryLimit do user-.slice, posso ver a alteração refletida no memory.limit_in_bytes do seu grupo.

No entanto, quando esse usuário executa uma VM do VirtualBox, embora o VirtualBox mostre o uso de 2 GB de RAM (veja ps output abaixo), essa memória não é refletida no arquivo memory.usage_in_bytes do cgroup:

$ cat /sys/fs/cgroup/memory/user.slice/user-1001.slice/memory.usage_in_bytes
1353863168

Eu posso ver o ID do processo do VirtualBox no arquivo cgroups tasks :

$ ps un -p 19678
    USER   PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    1001 19678 97.4 29.4 4660560 2378040 ?     Sl   07:25   3:48 /usr/lib/virtualbox/VirtualBox
$ grep 19678 /sys/fs/cgroup/memory/user.slice/user-1001.slice/tasks
19678

O arquivo memory.stat para o cgroup mostra os seguintes valores:

$ cat /sys/fs/cgroup/memory/user.slice/user-1001.slice/memory.stat
cache 423411712
rss 880754688
rss_huge 331350016
mapped_file 176910336
dirty 307200
writeback 0
pgpgin 14357052
pgpgout 14129610
pgfault 14533957
pgmajfault 16595
inactive_anon 546553856
active_anon 447401984
inactive_file 151785472
active_file 158326784
unevictable 36864
hierarchical_memory_limit 5368709120
total_cache 423411712
total_rss 880754688
total_rss_huge 331350016
total_mapped_file 176910336
total_dirty 307200

De acordo com memory.txt , rss + cache deve fornecer uma versão mais precisa de memory.usage_in_bytes . O resultado é 1304166400, que é ainda menor.

Então, por que a memória do VirtualBox é omitida?

EDIT : saída detalhada adicionada e memory.stat file.

    
por haggai_e 03.06.2016 / 13:26

1 resposta

1

Tenho a sensação de que este documento irá ajudá-lo muito (Seção 5.5 e 5.2 especialmente). Vou tentar resumir o melhor que posso aqui.

A melhor explicação que tenho é que os números fornecidos em memory.usage_in_bytes não são incrivelmente precisos, mas têm a intenção de fornecer uma ideia geral sobre a quantidade de memória que alguma coisa está usando. É provável que memory.stat forneça uma ideia mais precisa, embora mais complexa, da memória usada por diferentes processos. Se o uso de memória não aparecer aí, você pode ter um problema muito maior.

EDITAR: Se você continuar lendo na parte 5.2 desse documento, há algumas informações adicionais:

Only anonymous and swap cache memory is listed as part of 'rss' stat. This should not be confused with the true 'resident set size' or the amount of physical memory used by the cgroup. 'rss + file_mapped" will give you resident set size of cgroup. (Note: file and shmem may be shared among other cgroups. In that case, file_mapped is accounted only when the memory cgroup is owner of page cache.)

Nesse caso, ainda não funciona o que você está vendo, o que me leva a acreditar que o proprietário do processo de caixa virtual não é o proprietário de todos os caches de página em uso pelo processo de caixa virtual.

A última verificação de sanidade que eu aconselharia seria verificar o log killer da OOM e ver se o killer da OOM está ativo. Quando o assassino da OOM está ativo, você pode obter resultados estranhos dos registros de memória.

    
por 05.06.2016 / 05:01