“não pode alocar memória” erro ao tentar criar pasta na hierarquia cgroup

5

nos deparamos com um bug interessante hoje. Em nossos servidores, colocamos usuários em pastas cgroups para monitorar + controlar o uso de recursos como cpu e memória. começamos a receber erros ao tentar adicionar pastas cgroup de memória específicas do usuário:

mkdir /sys/fs/cgroup/memory/users/newuser
mkdir: cannot create directory ‘/sys/fs/cgroup/memory/users/newusers’: Cannot allocate memory

Isso pareceu um pouco estranho, porque a máquina realmente tinha uma quantidade razoável de memória livre e troca. Alterar os valores de sysctl para vm.overcommit_memory de 0 para 1 não teve efeito.

Percebemos que estávamos executando muitas subpastas específicas do usuário (cerca de 7.000 na verdade) e a maioria delas era para usuários que não estavam mais executando processos nessa máquina.

ls /sys/fs/cgroup/memory/users/ | wc -l
7298

excluir pastas não usadas na hierarquia do cgroup na verdade corrigiu o problema

cd /sys/fs/cgroup/memory/users/
ls | xargs -n1 rmdir
# errors for folders in-use, succeeds for unused
mkdir /sys/fs/cgroup/memory/users/newuser
# now works fine

Curiosamente, o problema afetou apenas o cgroup de memória. o cgroup cpu / accounting estava bem, apesar de ter mais usuários na hierarquia:

ls /sys/fs/cgroup/cpu,cpuacct/users/ | wc -l
7450
mkdir /sys/fs/cgroup/cpu,cpuacct/users/newuser
# fine

Então, o que estava causando esses erros de falta de memória? O próprio subsistema memory-cgroup possui algum tipo de limite de memória?

O conteúdo das montagens do grupo pode ser encontrado aqui

    
por hwjp 21.08.2017 / 18:21

1 resposta

0

Existem de fato limites por cgroup, você pode ler sobre eles no LWN.net :

Each cgroup has a memory controller specific data structure (mem_cgroup) associated with it.

.... Accounting happens per cgroup.

A quantidade máxima de memória é armazenada em /sys/fs/cgroup/memory/memory.limit_in_bytes . Se o problema que você experimentou estiver realmente conectado com o limite de memória cgroup , então /sys/fs/cgroup/memory/memory.max_usage_in_bytes deve estar próximo ao acima, que você pode verifique também inspecionando memory.failcnt , que registra o número de vezes que seu uso real atingiu o limite acima.

Talvez você também possa verificar memory.kmem.failcnt e memory.kmem.tcp.failcnt para obter estatísticas semelhantes sobre a memória do kernel e a memória temporária do tcp.

    
por 20.09.2017 / 12:35