Fonte: Manual do Ubuntu
Eu pareço ter um vazamento de memória maior no meu sistema ubuntu atual
Após relatar estranhos erros de memória do Eclipse ( link ) eu comecei para obter mensagens de erro "Não há memória suficiente" no meu console hoje - ao executar tarefas simples, como digitar em sudo -s
- ou até mesmo - free -m
Digitar 'free -m' repeadetly me mostrou como minha RAM sobe rapidamente de 700M para 900M, crescendo para o tamanho de 2000M em poucos segundos (depois de liberar memória com echo 3 > /proc/sys/vm/drop_caches
)
Eclipse não é a causa, eu matei completamente o processo e o RAM ainda estava subindo. Existe alguma maneira de detectar de onde vem o vazamento? Eu não posso nem atualizar meu sistema mais, já que apt-get update
falha (provavelmente porque está sem memória)
Usando Ubuntu 11.10
O truque drop_cache não irá liberar memória, ele irá redefinir o cache. Usa o comando ps se você quiser identificar quais processos usam mais memória.
Por exemplo, para monitorar a lista dos 15 principais usuários de memória residentes.
$ watch "ps --sort -rss -eo pid,pmem,rss,vsz,comm | head -16"
PID %MEM RSS VSZ COMMAND
2590 13.4 136892 825000 firefox
1743 10.7 109020 300780 Xorg
2067 8.5 86764 1118140 unity-2d-shell
3307 4.1 42560 627780 unity-2d-spread
2068 2.9 29904 617644 unity-2d-panel
2092 2.5 25524 1291204 nautilus
2457 1.9 20292 530276 gnome-terminal
2351 1.9 20016 821488 unity-scope-vid
2161 1.9 19476 531968 unity-panel-ser
2034 1.7 18256 759716 gnome-settings-
2074 1.5 16176 518016 nm-applet
2273 1.5 15452 580416 unity-lens-vide
2051 1.4 15112 524260 metacity
2395 1.2 12836 407336 update-notifi
Você também pode verificar a reserva de memória compartilhada, mas saberá apenas quem é o proprietário dos segmentos.
Alocação de Pmap:
$ ls -l /run/shm
total 272
-r-------- 1 ed ed 67108904 Nov 29 18:17 pulse-shm-1884617860
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-2352897759
-r-------- 1 ed ed 67108904 Nov 29 18:12 pulse-shm-3444873503
-r-------- 1 ed ed 67108904 Nov 29 18:12 pulse-shm-3485341848
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-535843976
-r-------- 1 ed ed 67108904 Nov 29 19:12 pulse-shm-789046959
-r-------- 1 ed ed 67108904 Nov 29 18:38 pulse-shm-863909656
$ df /run/shm
Filesystem 1K-blocks Used Available Use% Mounted on
none 509332 272 509060 1% /run/shm
observe que as alocações reservadas são muito maiores que as alocadas (df 'used')
Alocações do System V:
$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 294912 ed 700 122880 2 dest
0x00000000 327681 ed 700 4823040 2 dest
0x00000000 491522 ed 600 393216 2 dest
0x00000000 589827 ed 700 4578120 2 dest
0x00000000 425988 ed 700 27852 2 dest
0x00000000 458757 ed 600 393216 2 dest
Editar : precisa passar --sort -rss
para ps
para obter os processos com mais uso de memória, caso contrário, a lista de processos será classificada numérica e dará aos processos menos uso de memória.
Descubra o PID do processo que causa vazamento de memória.
ps -aux
capture o /proc/PID/smaps
e salve em algum arquivo como BeforeMemInc.txt
.
/proc/PID/smaps
e salve-o tem afterMemInc.txt
encontre a diferença entre o primeiro smaps
e o 2º smaps
, e. g. com
diff -u beforeMemInc.txt afterMemInc.txt
anote o intervalo de endereços em que a memória foi aumentada, por exemplo:
beforeMemInc.txt afterMemInc.txt
---------------------------------------------------
2b3289290000-2b3289343000 2b3289290000-2b3289343000 #ADDRESS
Shared_Clean: 0 kB Shared_Clean: 0 kB
Shared_Dirty: 0 kB Shared_Dirty: 0 kB
Private_Clean: 0 kB Private_Clean: 0 kB
Private_Dirty: 28 kB Private_Dirty: 36 kB
Referenced: 28 kB Referenced: 36 kB
Anonymous: 28 kB Anonymous: 36 kB #INCREASE MEM
AnonHugePages: 0 kB AnonHugePages: 0 kB
Swap: 0 kB Swap: 0 kB
KernelPageSize: 4 kB KernelPageSize: 4 kB
MMUPageSize: 4 kB MMUPageSize: 4 kB
Locked: 0 kB Locked: 0 kB
VmFlags: rd wr mr mw me ac VmFlags: rd wr mr mw me ac
use o GDB para despejar memória no processo em execução ou obter o coredump usando gcore -o process
Eu usei o gdb no processo em execução para despejar a memória em algum arquivo.
gdb -p PID
dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
agora, use o comando strings
ou hexdump -C
para imprimir o dump_outputfile.dump
strings outputfile.dump
Você obtém um formato legível no qual é possível localizar essas cadeias de caracteres seu código-fonte.
Analise sua fonte para encontrar o vazamento.
Eu tenho uma máquina mais antiga que eu uso que constantemente envia mensagens de vazamento de memória:
root@:~# free -m
total used free shared buffers cached
Mem: 1898 1523 374 131 32 588
-/+ buffers/cache: 902 995
Swap: 1942 480 1462
Meu script:
sync; sudo echo 3 > /proc/sys/vm/drop_caches
Nomeou-o como cache.sh
root@~# ./cache.sh
root@~# free -m
total used free shared buffers cached
Mem: 1898 1106 791 126 1 207
-/+ buffers/cache: 897 1000
Swap: 1942 480 1462
Você pode ver que eu estava com 374 MB, executei o sync; sudo echo 3 > /proc/sys/vm/drop_caches
e ganhei 417 MB de volta. Pode-se usar cron
para executar a cada 5 minutos ou apenas ter um terminal aberto e executá-lo quando houver um desempenho lento. Sim, preciso adicionar memória à máquina ...
memstat também é uma boa ferramenta que mostrará 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.
Eu tive um problema semelhante, mas com uma solução muito estranha.
Por alguma razão desconhecida, eu tinha um servidor de e-mail na configuração do meu laptop e rodando. Eu não sei por que eu tive isso ... No entanto, eu abandonei o serviço e descobri que o software no meu laptop estava sob um ddos ataque.Após que tudo estava normal.