Parece que tenho um vazamento de memória maior no meu sistema atual do ubuntu
Após relatar erros de memória estranhos do Eclipse ( /ubuntu/148998/eclipse-constant-different-out-of-memory-errors ), comecei a receber mensagens de erro 'Memória insuficiente' no meu console hoje - enquanto executando tarefas simples como digitar sudo -s
- ou até mesmo -free -m
Digitar 'free -m' repetidamente me mostrou como minha RAM aumenta rapidamente de 700M para 900M, crescendo até o tamanho de 2000M em alguns segundos (depois de liberar memória com echo 3 > /proc/sys/vm/drop_caches
)
Eclipse não é a causa, eu finalizei completamente o processo e o carneiro ainda estava subindo. Existe alguma maneira de detectar de onde vem o vazamento? Não consigo mais atualizar meu sistema, pois apt-get update
falha (provavelmente porque está com falta de memória)
Usando Ubuntu 11.10
fonte
Respostas:
memprof
Fonte: Manual do Ubuntu
fonte
Primeiro, verifique se há uma pasta temporária disponível com espaço livre suficiente. Os comandos a seguir criam despejos que podem ter vários GBs de tamanho.
Você pode criar uma nova pasta tmp usando o seguinte comando. Você pode querer mudar
/tmp
para um sistema de arquivos diferente, com espaço suficienteEtapas para encontrar vazamento de memória
Descubra o PID do processo que está causando o vazamento de memória (você também pode usar, por exemplo,
htop
se disponível) e armazene-o em uma variável chamadapid
Dado que o PID está disponível na variável
pid
, você pode capturar o consumo de memória usando/proc/$pid/smaps
e salvando em algum arquivo comobeforeMemInc.txt
.Capture
/proc/$pid/smaps
novamente e salve-o comoafterMemInc.txt
Encontre a diferença entre o primeiro
smaps
e o segundosmaps
, por exemplo, comAnote o intervalo de endereços em que a memória aumentou, por exemplo:
Use o GDB para despejar memória no processo em execução ou obter o coredump usando
Eu usei o gdb no processo em execução para despejar a memória em algum arquivo.
Agora, use o
strings
comando ouhexdump -C
para imprimir omemory.dump
A partir disso, você obtém informações legíveis que ajudam a localizar essas strings no seu código-fonte.
fonte
cat /proc/2882/smaps > /tmp/before.txt
na etapa 2. O que fiz de errado?O truque drop_cache não liberará memória, redefinirá o cache. Usa o comando ps se você deseja identificar quais processos usam mais memória.
Por exemplo, para monitorar a lista dos 15 principais usuários de memória residente.
Você também pode verificar a reserva de memória compartilhada, mas só saberá quem é o proprietário dos segmentos.
Alocação de Pmap:
observe que as alocações reservadas são muito mais altas que as páginas alocadas reais (df 'used')
Alocações do sistema V:
Editar : é necessário passar
--sort -rss
paraps
obter os processos com mais uso de memória; caso contrário, a lista de processos é classificada aumentando numérica e fornece aos processos com menos uso de memória.fonte
Eu tenho uma máquina mais antiga que eu uso que cospe constantemente mensagens de vazamento de memória:
Meu script:
Nomeado
cache.sh
Você pode ver que eu tinha 374 MB, executei o
sync; sudo echo 3 > /proc/sys/vm/drop_caches
e ganhei 417 MB de volta. Podecron
-se executar a cada 5 minutos ou apenas abrir um terminal e executá-lo quando houver desempenho lento. Sim, preciso adicionar memória à máquina ...fonte
O memstat também é uma boa ferramenta que mostra a quantidade de memória usada por cada bloco, bem como a quantidade de memória usada pelas bibliotecas carregadas. Não é a melhor ferramenta, mas vale a pena usar para reunir detalhes e estatísticas.
memstat -w -p pid
é um bom comando para usar.fonte
Eu tive um problema semelhante, mas com uma solução muito estranha.
Por alguma razão desconhecida, eu tinha um servidor de e-mail no meu laptop configurado e em execução. Não sei por que o tinha ... No entanto, desliguei o serviço e percebi que esse software no meu laptop estava sob ataque de ddos. Depois disso tudo foi normal.
fonte