Como detectar um vazamento de memória no Ubuntu



Experimente Nosso Instrumento Para Eliminar Problemas

Existem vários motivos pelos quais um vazamento de memória pode ocorrer no Ubuntu, mas, felizmente, é óbvio quando eles ocorrem. O código com erros costuma ser o maior motivo, já que os programadores podem não ter tido a oportunidade de verificar para garantir que a memória que não é mais necessária seja liberada. Se você está instalando pacotes instáveis ​​ou compilando código da fonte, pode estar lidando com vazamentos de memória por esse motivo. Você provavelmente começará a notá-los porque os pacotes de aplicativos de software começam a reclamar de falta de memória quando há mais RAM física do que suficiente instalada.



Se você estiver preocupado com um vazamento de memória, tente digitar free repetidamente em um terminal. Se de repente você começar a ver o uso de RAM crescendo rapidamente, então você já detectou um vazamento de memória. Se você receber um erro parecido com bash: Memória insuficiente ao fazer isso e você não tem nada além de um terminal ou mesmo apenas um console virtual aberto, então você está quase inquestionavelmente lidando com um. Alguns vazamentos de memória podem ser um pouco mais sutis, mas o Ubuntu e seus vários spin-offs apresentam ferramentas e pacotes que podem ajudá-lo a detectá-los.



Detectando vazamentos de memória no Ubuntu

Como as ferramentas usadas para detectar vazamentos de memória são baseadas principalmente no prompt CLI, não importa em qual versão do Ubuntu você as executa. Eles devem funcionar bem dentro de um terminal Unity no Ubuntu regular, de um console virtual no Ubuntu Server, de um lxterm no Lubuntu, um Konsole no Kubuntu ou mesmo dentro do Xfce no Xubuntu. Tente realizar uma tarefa simples como sudo -s e digite sua senha para começar.



Isso deve dar a você um shell de root se executado corretamente, mas pode causar um erro de memória se você estiver trabalhando com um vazamento que já foi longe demais. Se você realmente conseguir acessar um shell de root, tente digitar echo 3> / proc / sys / m / drop_caches, pressione a tecla Enter e digite exit. Tente executar free ou free -m novamente para ver se isso ajudou a liberar memória.

Alguns programadores argumentam que não há sentido em forçar o Kernel a eliminar seus caches, uma vez que eles devem ser liberados e, portanto, recuperados assim que for necessária memória física adicional. No entanto, embora a liberação forçada desses caches prejudique o desempenho do sistema, tenha em mente que se trata apenas de um teste. Depois de reinicializar o sistema, o kernel do Linux deve mais uma vez montar os caches de memória da maneira como estavam antes.

Algumas pessoas sugeriram adicionar a sincronização de linha; sudo echo 3> / proc / sys / vm / drop_caches para um script que o cron executa de forma consistente, mas isso anula o propósito do cache de memória em primeiro lugar. A memória livre em si é meramente RAM não utilizada, o que significa que os dados devem ser carregados de muito mais lentoeletromecânico ou dispositivos de armazenamento NAND. Não importa o quão rápido esses dispositivos sejam, eles não são tão rápidos quanto a RAM, o que significa que embora você deva consertar vazamentos de memória, você não deve realmente adulterar o sistema de cache depois de configurá-lo para a configuração ideal.



Se você decidiu que realmente tem um vazamento de memória consistente que acontece periodicamente durante o uso de sua máquina e não pode ser restringido especificamente, mas você ainda tem acesso CLI, tente executar o comando top. Isso deve fornecer uma lista dos processos em execução.

Se o Ubuntu apresentar um erro incomum sobre o top, tente emitir o busybox top para acessar uma versão ainda mais simples deste programa. Depois de ter uma lista, olhe para% MEM ou coluna semelhante para ver quais aplicativos são atribuídos a mais memória. Embora você possa anotar o PID e emitir um comando kill para o número exato do PID, isso apenas forçará o fechamento do aplicativo. A memória que eles usam pode ainda não ser liberada depois que você fizer isso, embora valha a pena tentar.

Se você encontrar um aplicativo que está usando uma grande quantidade de memória, pressione q para sair e tente matar #### com o número PID da tela anterior. Os processos do sistema não devem ser eliminados dessa maneira, nem nada que você tenha não salvo funcione. Pense nisso de forma semelhante a matar algo com a lista de tarefas Ctrl + Alt + Del, que você também pode usar para este mesmo processo.

Quando você encontrar um programa no qual isso está acontecendo de forma consistente, você pode configurá-lo para evitar esse comportamento no futuro. Cada programa individual, é claro, precisará de um recurso diferente, que está além da tarefa de meramente detectar vazamentos de memória.

Se você não estiver apenas solucionando problemas de aplicativos, mas também trabalhando realmente com código, existem alguns outros recursos que você tem. O Ubuntu e seus derivados oferecem as rotinas membarrier, memusage e memusagestat C para programação.

Basta usar man membarrier, man memusage ou man memusagestat para visualizar as páginas do Manual do Programador Linux sobre essas rotinas importantes. Se houver atualizações em versões futuras das bibliotecas à medida que novas versões do Ubuntu forem lançadas, as mudanças sempre serão descritas aqui.

Se você precisar de conteúdo gráfico, o memusagestat ainda oferece a opção de salvar uma representação gráfica do uso da memória em um arquivo PNG. Isso o torna um recurso atraente também para autores de utilitários, pois pode ser usado para fazer aplicativos que verificam regularmente se há vazamentos de memória.

Você também pode instalar o memprof, que é uma ferramenta para traçar o perfil do uso de memória para ajudá-lo a encontrar vazamentos de memória. Ele gera um perfil sobre quanta memória cada função em um programa que você está escrevendo aloca. Ele também pode varrer a memória existente para encontrar blocos que foram alocados, mas não apresentam mais referências genuínas. Ele faz isso pré-carregando uma biblioteca para substituir os recursos de alocação de memória da biblioteca C padrão.

Se você planeja usar isso, certifique-se de remover a linha include memprof do início do seu código antes de liberá-lo. Isso é usado para garantir que você não tenha vazamentos, mas não deve se tornar uma dependência se você empacotar seu código e liberá-lo em um repositório.

4 minutos lidos