CLI AI

Encontre o processo cuja memória não para de crescer

2026-05-08

"Usar muita memória" e "vazar memória" são problemas diferentes. Um vazamento é um processo cujo RSS sobe de forma constante e nunca cai, mesmo com a máquina ociosa. Uma única captura não mostra isso — são necessárias duas, tiradas com intervalo.

1. Quem é o maior agora

clai
$ clai lista os processos ordenados por uso de memória→ ps -eo pid,comm,rss,%mem --sort=-rss | head -4    PID COMMAND           RSS %MEM 218979 firefox       2089376  3.1 269458 verba         1257196  1.9 727108 telegram      1249824  1.9

RSS está em kilobytes e é o número que importa: memória física realmente residente. Esta é sua lista de suspeitos, não a resposta.

2. Observe um processo ao longo do tempo

clai
$ clai amostre a memória do pid 269458 a cada 10 segundos, 6 vezes→ pidstat -r -p 269458 10 6

Este é o teste de verdade. RSS subindo nas seis amostras com carga estável é vazamento. Subir e depois estabilizar é um cache enchendo, o que é normal e vai parar sozinho.

3. Amostragem barata sem pacotes extras

clai
$ clai registre a memória deste processo a cada minuto em um arquivo→ while sleep 60; do printf '%s %s\n' "$(date +%T)" "$(grep VmRSS /proc/269458/status)"; done | tee mem.logVmRSS:	  1257196 kB

pidstat vive no pacote sysstat e nem sempre está instalado. /proc/<pid>/status está sempre lá. Deixe rodando por uma hora e a forma da resposta ficará óbvia.

4. Para onde foi a memória dentro do processo

clai
$ clai mostre o mapa de memória do pid 269458 ordenado por tamanho→ sudo pmap -x 269458 | sort -k3 -rn | head

Um único mapeamento anônimo que cresce entre duas execuções do pmap é o heap. Muitos mapeamentos pequenos que continuam se multiplicando geralmente indicam pilhas de threads vazadas ou arquivos mapeados com mmap não fechados.

5. Descarte primeiro o cache de arquivos

clai
$ clai mostre o uso de memória sem contar cache e buffers→ free -h               total        used        free      shared  buff/cache   availableMem:            62Gi        18Gi       2.1Gi       1.2Gi        42Gi        43Gi

Olhe para available, não para free. O Linux enche de propósito a RAM livre com cache de páginas e a devolve sob demanda. "Só 2 GB livres" com 43 GB available é um sistema saudável, não um vazamento.

6. Confirme que é o processo, não a máquina

clai
$ clai verifique se o kernel andou matando processos por falta de memória→ sudo dmesg -T | grep -i 'killed process'

Se o OOM killer disparou, o kernel registra qual processo escolheu e sua memória naquele momento. É a confirmação mais forte que você vai conseguir, e já está anotada para você.

Pegadinhas

  • RSS conta a memória compartilhada duas vezes. Dois processos que compartilham uma biblioteca reportam ambos as mesmas páginas. Para um número real por processo, use o PSS de smem ou /proc/<pid>/smaps_rollup.
  • Reiniciar é um paliativo, não um diagnóstico. Isso zera o gráfico e esconde as evidências. Primeiro meça, depois reinicie.
  • Limites de contêiner são invisíveis de dentro. Um processo em um contêiner vê a memória total do host em free; o limite real está em /sys/fs/cgroup/memory.max.

Perguntas relacionadas

Quanto crescimento é um vazamento? Qualquer inclinação sustentada para cima com carga estável. Um processo que ganha 50 MB por hora e nunca devolve vai bater no OOM killer mais cedo ou mais tarde, não importa quanta RAM você adicione.

Uso alto de memória no Linux é ruim? Não por si só. RAM não usada é RAM desperdiçada — o kernel a usa como cache e a recupera sob pressão. Fique de olho no available e na atividade de swap.

Qual ferramenta encontra a linha de código que vaza? Valgrind (--leak-check=full) para C e C++, ou o profiler de heap da sua linguagem. Os comandos daqui encontram qual processo; corrigi-lo é outra ferramenta.

Veja também

Diga o que você quer medir, e o CliAI escreve a chamada do pidstat que você teria que procurar de outro jeito. Instale em uma linha.