Em um sistema iniciado free
recentemente , 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=name
relatórios menos de 20% usados (e 80% disponíveis), tudo o resto diz diferentemente. free -m
por 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 startx
com ê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 -m
saí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
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:
- Quais poderiam ser as possíveis causas?
- Como posso identificar melhor os processos / aplicativos envolvidos?
- 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! ps
diz:
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:
Veja a gota de identificadores de arquivo no final? Esse foi o reinício do plasma.
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.
sudo bash -c 'sync; echo 3 > /proc/sys/vm/drop_caches'
o carneiro extra? Você pode visualizar arquivos abertos de programas usandolsof