
Parece que tenho um vazamento de memória no espaço do kernel, a laje mostra kmalloc-4096 crescendo perpetuamente em um clipe uniforme até monopolizar todos os recursos de memória RAM do sistema e forçar a troca.
Free mostra grande parte desse uso de memória como cache, mas se recusa a liberar quando necessário, ou mesmo quando sinalizado para limpeza manual. Um exemplo do que estamos vendo:
$ sudo su -c "free -h && sync && echo 3 > /proc/sys/vm/drop_caches && free -h"
total used free shared buff/cache available
Mem: 15G 4.4G 166M 280M 10G 104M
Swap: 15G 7.8G 8.1G
total used free shared buff/cache available
Mem: 15G 4.4G 186M 280M 10G 115M
Swap: 15G 7.8G 8.1G
Devo criar um perfil do kmalloc para determinar onde está o vazamento? Se sim, como posso fazer isso?
Esta é uma instalação padrão do Ubuntu 16.04 em um Intel i5 Skylake.
$ uname -a
Linux fire 4.4.0-78-generic #99-Ubuntu SMP Thu Apr 27 15:29:09 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Responder1
A 'sincronização' não vai reduzir o buff/cache, apenas solicita que os dados vão para os dispositivos de bloco. O objetivo do cache é que os dados permaneçam nos caches RAM. Enviar um 3 para drop_caches também não espera que os caches sejam descartados. Você poderia adicionar um 'sono 60' antes do 'grátis'? Isso pode permitir algum tempo para a memória ser limpa antes de relatar que está livre.
Deixar um 'watch -n60 cat /proc/meminfo' pode ajudar a mostrar a área de memória que está crescendo, mas cache e buff não são vazamentos sozinhos, ao consumir memória eles estão cumprindo seu propósito e fazendo o melhor uso do seu sistema disponível recurso.
Se um processo for trocado para disco, isso não significa automaticamente que algo ruim aconteceu. O kernel está fazendo a coisa certa se esse processo não estiver usando todas as suas páginas e estiver ocioso, há uma chance razoável de que em um servidor web o conteúdo na raiz www seja necessário antes que uma cópia do mutt continue em execução. Tela GNU quando o usuário efetuou logout, por exemplo.
Se você ainda considera que o kernel está consumindo RAM através de módulos, você pode inspecionar isso um pouco mais usando:
awk '{ print $2" "$1 }' /proc/modules | sort -n
Você está usando ZFS? Isso exige muita RAM, mas, assim como o cache, ele tenta manter a E/S do disco na RAM, caso seja necessário.