Encontrando vazamento de memória no Linux

3

Eu estou ficando louco tentando encontrar um vazamento de memória em uma de nossas caixas principais. Ele roda o CentOS, kernel 2.6.18, x86-64. A caixa (na verdade VM no Xen) tem funcionado muito bem sem problemas desde que foi criada há cerca de 6 meses. Ele foi criado para substituir uma caixa física mais antiga e foi configurado da mesma maneira. A VM é um servidor da Web e executa apenas o Tomcat e o Apache. Era sólido, não apresentava problemas nem vazamentos de memória.

Cerca de duas semanas atrás, tivemos um problema em que dois dos quatro servidores físicos em nossa configuração do Xen foram reinicializados (por algum motivo). Nós voltamos um pouco depois, e não tivemos muitos problemas (tivemos que recarregar um banco de dados MySQL que perdeu alguns registros durante a replicação devido à interrupção).

Desde então, tivemos problemas de memória nesta VM. Todas as outras máquinas virtuais que temos não tiveram problemas, apenas este. O uso de memória aumentaria até 200 MB / h até a caixa acabar. Ele iria mastigar através de swap, em seguida, o assassino OOM iria começar a causar problemas até que nós reiniciamos a VM.

Depois de tentar outras coisas (reinicializar a VM, reinicializar o servidor físico, migrar a VM para um servidor físico diferente), usei o RPM para verificar todos os arquivos no disco para tentar encontrar danos. Eu encontrei alguns arquivos, em pacotes que eu não tenho certeza se usamos, então eu reinstalei os pacotes para que eles fiquem limpos novamente.

Isso diminuiu o vazamento, mas ainda está lá. Agora estamos vazando a 10-50 MB / h, mas parece acelerar perto do fim. Ontem, quando o servidor estava quase ocioso, a memória subiu rapidamente, subindo 2,5 GB em menos de 12 horas por algum motivo.

Curiosamente, depois de executar o rpm para verificar tudo, antes de o processo sair, ele pegou quase toda a memória física livre e a VM teve que ser reinicializada depois disso. A única mudança de configuração que foi feita é aumentar a memória da VM de 2 GB para 4 GB, para que leve mais tempo para ficar sem memória e tenhamos que reinicializá-la menos.

Eu tentei rastrear a memória. Parece que há páginas anônimas que estamos perdendo e, como a caixa realmente não usa o disco, não me surpreende que as páginas que estamos perdendo não sejam protegidas pelo disco. O Tomcat / Java tem 2 GB de memória virtual e tem cerca de 1 gig residente (é distribuído até 1.5 GB). Como eu disse anteriormente, esta é a configuração que ela tem há mais de 6 meses, e a configuração da caixa que ela tinha usado antes por anos antes disso.

Nosso software não foi atualizado na caixa em cerca de uma semana antes do incidente, então não foi isso. Nós o reconstruímos e atualizamos desde então, mas isso não resolveu o problema.

Nós tentamos atualizar todo o resto do sistema usando o yum, mas isso não fez diferença. O único software instalado sem o yum foi o Java (que atualizei) e o nosso software (que atualizei).

Eu escrevi um pequeno programa para rastrear o tamanho virtual total, o tamanho do residente e o tamanho do segmento de dados para cada processo na VM, totalizando números no sistema de arquivos / proc. Depois de deixá-lo rodar por um dia, você pode ver o tamanho virtual do Apache saltar para cima e para baixo com a carga, mas o tamanho residente basicamente nunca mudou. Java arrastou-se muito lentamente, ao som de talvez 50MB durante todo o dia, e de acordo com o que seria de esperar. No entanto, durante esse tempo, perdemos mais de 500 MB de memória. Top não mostra nada usando mais memória que o Java. Meu programa encontrou todos os processos no servidor (com exceção de Java e Apache) não mudou em mais do que alguns kilobytes ao longo do dia.

Basicamente, algo está comendo a nossa memória, mas eu estou em uma perda total para descobrir o que. O kernel é o meu melhor palpite, mas mesmo quando o uso da memória é alto, o tamanho da memória do kernel (uma listagem em / proc / vmstat que eu não lembro acima da minha cabeça) era de apenas 200 megabytes. >

Neste ponto, estamos prontos para reconstruir a VM a partir do zero. Eu acho que é a conclusão final.

Como você rastreia o que está vazando memória quando algo assim acontece? Eu nunca vi um vazamento de memória como este (que não aparece no topo), mas minha experiência é bastante limitada. Alguém pode sugerir algo que eu possa olhar ou uma ferramenta que eu possa usar em casos como este?

    
por MBCook 28.09.2009 / 16:38

3 respostas

2

É possível que a VM tenha sido invadida? As ferramentas que você está usando para monitorar a lista de processos e memória de um meio de leitura válido são boas? Você pode ter um rootkit instalado que esconde os processos com vazamento.

    
por 28.09.2009 / 17:08
0

Temos algo parecido com o Centos05 e o mesmo kernel. A memória RAM aumenta continuamente, é inexplicável. Estamos pensando que isso pode estar relacionado a alguma biblioteca / programa que instalamos. Você tem o Hdf5 instalado e qual versão? No momento, esse é nosso principal suspeito. O OpenMPI / mpich2 foi o nosso primeiro suspeito, no entanto, aqueles parecem estar bem. Não tenho certeza embora. Se bem me lembro, o problema também estava ocorrendo com um kernel anterior.

    
por 26.10.2009 / 17:31
0

Eu tive problemas com xen rebooting, foi muito ruim em kernels posteriores e encontrei 1 VM que eu mudei de um servidor de reinicialização para outro servidor causou-o a falhar também, então eu percebi que era um dos convidados. Eu usei o Citrix xen que usava o kernel 2.6.18 e tinha reconstruído o guest e tinha sido sólido, mas agora mudei do citrix para o kernel xen 2.6.18 normal com um guest novamente reconstruído e ainda está bem. Mais tarde, comecei a ter problemas com outro convidado xen, mas não tirar o host, mas fez com que o convidado a falhar tão mal que eu não conseguia entrar no console e apenas atualizei todos os componentes para a liberação instável. esquisito o suficiente, é realmente estável agora:)

    
por 21.07.2010 / 12:52