Perfil de uso do kmalloc

Perfil de uso do kmalloc

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.

informação relacionada