RAM livre desaparece - vazamento de memória?

11

Em um sistema iniciado freerecentemente , os relatórios sobre 1,5G usavam RAM (8G RAM no total, Ubuntu 12.04 com lightdm e desktop de plasma, uma janela do konsole foi iniciada). Com os aplicativos em execução que eu uso, ele ainda consome não mais que 2G. No entanto, com o sistema em funcionamento por alguns dias, mais e mais da minha RAM livre desaparece - sem aparecer na lista de aplicativos usados: enquanto os smem --pie=namerelatórios menos de 20% usados ​​(e 80% disponíveis), tudo o resto diz diferentemente. free -mpor exemplo, relatórios sobre o dia 7:

             total       used       free     shared    buffers     cached
Mem:          7459       7013        446          0        178        997
-/+ buffers/cache:       5836       1623
Swap:         9536        296       9240

(para que você possa ver, não são os buffers ou o cache). Hoje isso finalmente terminou com o sistema travando completamente: o gerenciador de janelas desapareceu, os aplicativos "pairando no ar" (sem moldura) - e um pop-up me notificando sobre "muitos arquivos abertos". Relatórios Syslog:

kernel: [856738.020829] VFS: file-max limit 752838 reached

Então fechei os aplicativos que consegui fechar e matei o X usando Ctrl-Alt-backspace. Depois disso, o X tentou aparecer novamente com o failafeX, mas não conseguiu fazê-lo, pois não conseguia mais detectar sua configuração. Então, mudei para um console usando Ctrl-Alt-F2, capturei todas as informações que consegui pensar (vmstat, free, smem proc/meminfo, lsof, ps aux) e finalmente reiniciei. X voltou a apresentar o failafeX; desta vez, eu disse para "recuperar da minha configuração de backup", depois mudei para um console e usei startxcom êxito para abrir o ambiente gráfico.

Não tenho nenhuma pista real sobre o que está causando esse problema - embora deva ter a ver com o próprio X ou com alguns processos de usuário em execução no X - como após matar o X, a free -msaída ficou assim:

             total       used       free     shared    buffers     cached
Mem:          7459       2677       4781          0         62        419
-/+ buffers/cache:       2195       5263
Swap:         9536         59       9477

(~ 3,5 GB sendo liberado) - para comparar com a saída após um novo começo:

             total       used       free     shared    buffers     cached
Mem:          7459       1483       5975          0         63        730
-/+ buffers/cache:        689       6769
Swap:         9536          0       9536

São fornecidas mais duas saídas úteis por memstat -u. Pouco antes do acidente:

User     Count     Swap      USS      PSS      RSS
mail         1        0      200      207      616
whoopsie     1      764      740      817     2300
colord       1     3200      836      894     2156
root        62    70404   352996   382260   569920
izzy        80   177508  1465416  1519266  1851840

Depois de matar o X:

User     Count     Swap      USS      PSS      RSS
mail         1        0      184      188      356
izzy         1     1400      708      739     1080
whoopsie     1      848      668      826     1772
colord       1     3204      804      888     1728
root        62    54876   131708   149950   267860

E após uma reinicialização, de volta ao X:

User     Count     Swap      USS      PSS      RSS
mail         1        0      212      217      628
whoopsie     1        0     1536     1880     5096
colord       1        0     3740     4217     7936
root        54        0   148668   180911   345132
izzy        47        0   370928   437562   915056

Uso do sistema de arquivos por uma semana Uso de kernel / CPU por uma semana

Edit: Acabei de adicionar dois gráficos do meu sistema de monitoramento. Interessante ver: sempre que há um "salto" no consumo de memória, a CPU também atinge o pico. Acabei de encontrar isso agora - e isso me lembra outro indicador apontando para o próprio X: Muitas vezes, ao retornar à minha máquina e desbloquear a tela, encontrei algo fazendo um trabalho pesado na minha CPU. Verificando com top, sempre acabou por ser /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none.

Então, depois dessa longa explicação, finalmente minhas perguntas:

  1. Quais poderiam ser as possíveis causas?
  2. Como posso identificar melhor os processos / aplicativos envolvidos?
  3. Que medidas podem ser tomadas para evitar esse comportamento - curto de reiniciar a máquina todos os dias X?

Eu estava executando o 8.04 (Hardy) por cerca de 5 anos na minha máquina antiga, nunca tendo experimentado o mesmo (sempre mais de 100 dias de atividade, antes de reiniciar para, por exemplo, atualizações do kernel). Esta é agora uma nova máquina completa com uma nova instalação do 12.04 . Caso isso importe, algumas especificações:

AMD APU A4-3400 com placa gráfica Radeon (tm) HD, usando o driver ati / radeon de código aberto (portanto, não há fglrx instalado), 8 GB de RAM, disco rígido WDC WD1002FAEX-0 (1 TB), placa principal Asus F1A75-V Evo. Ubuntu 12.04 de 64 bits com KDE4 / Plasma. Os aplicativos geralmente abertos mais ou menos permanentemente incluem Evolution, Firefox, konsole (com o Midnight Commander em execução, cerca de 4 guias) e LibreOffice - além de ocasionalmente Caliber, Gimp e Moneyplex (software bancário que eu já uso há quase 20 anos, em uma versão que funcionou bem em Hardy).

Edit: Hoje encontrei um dos "malvados": o plasma-desktop do KDE4s. A memória usada estava novamente com até 5 GB quando eu fiz um killall plasma-desktop && plasma-desktop. Isso liberou 1,3 GB de RAM! psdiz:

                             RSS    SIZE   VSZ
plasma usage before restart  120988 526472 1300816
plasma usage after restart   92352  495972 1263632

Então, onde estão esses 1,3 GB? A diferença entre esses valores, se somados, é de 96 MB - e não de 1,3 GB.

E isso pode ser apenas uma parte, pois ainda estão em uso 3,7 GB (devem ser menores que 2 GB). Eu monitorei isso nos últimos 6 dias usando várias ferramentas: a memória usada (sem falar em cache e buffers) aumenta lenta mas constantemente. Mesmo que eu não esteja na minha mesa para executar qualquer coisa ...

Quanto ao monitoramento de processos com arquivos abertos, atualmente uso o seguinte liner (eu amo shell e principalmente bash) para obter o top 5:

echo "$(for pid in $(ls -a /proc|egrep '^([0-9])*$'|sort -n 2>/dev/null); do \
if [ -e /proc/$pid/fd ]; then FHC=$(ls -l /proc/$pid/fd|wc -l); \
if [ $FHC -gt 0 ]; then PNAME="$(cat /proc/$pid/comm)"; \
echo "$FHC files opened by $pid ($PNAME)"; fi; fi; done)"|sort -r -n|head -n5

Comando aqui em 4 linhas para melhor legibilidade. Nada muito a partir daí - exceto que o Skype não gosta de ter a conexão com a Internet interrompida. Cada desconexão causa um ligeiro aumento de seus arquivos abertos, mas nada dramático. Por outro lado, parece que o plasma também é responsável por isso:

Uso de VFS (2 dias)

Veja a gota de identificadores de arquivo no final? Esse foi o reinício do plasma.

Izzy
fonte
Limpa sudo bash -c 'sync; echo 3 > /proc/sys/vm/drop_caches'o carneiro extra? Você pode visualizar arquivos abertos de programas usandolsof
Savvas Radevic
Você também tentou trocar de gerenciador de desktop? por exemplo, lxde (ou lubuntu-desktop)? Finalmente, você tem certeza de que a saída para o disco está correta? Você verificou os dados SMART do disco e a velocidade de cópia de arquivos de / para o disco usando um live cd?
Savvas Radevic
Marque isso para testar se há um vazamento Como detectar um vazamento de memória
Mitch
@medigeek: Como apontei, caches e buffers não são o problema. Veja a saída de free. Mudando para um DE diferente, eu realmente considerei; se o KDE3.5 estivesse disponível, eu não havia terminado com o plasma. Isso pode ser temporário apenas para verificar se o plasma está envolvido.
Izzy
@ Mitch: Eu entendi que o memprof deveria ser usado contra um processo conhecido (que ainda não isolei). Claro que pode ser usado em todo o sistema? Além disso, como o erro "muitos arquivos abertos" sugere, para mim parece que algum processo está abrindo muitos manipuladores de arquivos, nunca os liberando. Não tenho certeza se isso seria detectado pelo memprof. Agora configurei um script para capturar os 5 principais processos por arquivos abertos - espero que isso aconteça com o maligno.
Izzy

Respostas:

6
  1. O grande número de arquivos abertos é uma boa pista de que algo está errado. Meu palpite seria algum daemon do sistema KDE.

  2. Abra um console e execute "top". Em seguida, use <e> para alterar a coluna de classificação para VIRT ou RES e veja quais programas estão usando mais memória. Um vazamento de memória será exibido como um uso de memória virtual massivamente inflado, pois uma vez perdido o ponteiro para a memória vazada, ele não será usado e será trocado. Execute também "lsof" e procure um processo com muitos arquivos abertos, pois esse parece realmente ser um vazamento de descritor de arquivo.

  3. Localize o programa e relate um erro.

Alistair Buxton
fonte
Eu já tentei utilizar o top / htop para isso. O problema é que ele não mostrou resultados quanto à memória RESident (como descrito acima, apenas uma pequena parte da memória usada pode ser conectada aos aplicativos em execução). E quanto à memória VIRTual, é difícil de interpretar (mesmo logo após a inicialização, a memória virtual usada soma até 3 TB aqui - um tamanho que nem meu disco rígido suportava). Então, atualmente, por exemplo, o Evolution usa 1,9 GB de VIRT, de acordo com a parte superior, enquanto a memória geral em uso é de 1,2 GB (excluindo cache e buffers). E sim, minha primeira intenção é rastrear o programa, para que eu pudesse registrar um bug ...
Izzy
Acabei de adicionar 2 imgs do meu sistema de monitoramento. Parece que os "saltos" sempre aconteciam na mesma hora do dia (uma exceção). Infelizmente, os imgs não fornecem data e hora para verificar com o cron. Btw: existe alguma maneira de monitorar qual processo tem quantos arquivos abertos?
Izzy
1
Seu palpite foi bom. Embora não seja um daemon, era principalmente um componente do KDE: plasma-desktop (veja acima). O engraçado: descobri e publiquei aqui - e 10 minutos depois, no meu diário, apt-get update && apt-get upgradehouve uma atualização para o plasma-desktop; esses caras são rápidos X) Agora eu apenas assisto por um tempo para ver se o problema está resolvido, antes de declarar isso. Até agora, as coisas parecem bastante promissoras.
Izzy
Ainda parece estável. Embora nem lsofnem topme tenha apontado para o "processo maligno", seu palpite sobre o daemon do KDE me apontou na direção do criador de problemas. Então, obrigado novamente - o tempo de atividade da minha máquina agora é de aproximadamente 14d e tudo ainda parece estável, embora eu tenha rodado coisas como o VirtualBox, compilando etc. em paralelo. Então, eu considero isso resolvido, e marque a correspondência mais próxima :) #
Izzy
0

Eu acho que é um comportamento normal do sistema. Provavelmente está tudo bem.

Você pode ler este artigo brilhante (o linux comeu meu ram) para entender como o linux está gerenciando seu ram e por que não há necessidade de se preocupar:

http://www.linuxatemyram.com/

gemue2010
fonte
4
Ah - nunca ouvi dizer que é "comportamento normal do sistema" se o sistema travar após 7 dias com o erro "muitos arquivos abertos". Estou executando o Linux há cerca de 15 anos, nunca tive isso. E sim, eu entendo perfeitamente como o Linux utiliza "RAM grátis" (usando-o para armazenar em cache etc.) Como apontado acima: cache e buffers não são o problema aqui. Não estou falando de RAM sendo usada por boas razões - o Linux nunca se ateria aos caches pelo preço da troca.
Izzy