Algo come toda a memória (suspeito de vazamento de memória em algum aplicativo). Como detectar o que?

14

Eu tenho um servidor que executa o pacote liquidsoap + icecast e um site simples (httpd + mysqld). Nada especial. Visitantes em torno de 2000+ por dia, com cerca de 50 sendo on-line simultaneamente, em média.

O servidor tem 8 GB de RAM. À medida que o tempo passa, a quantidade de memória livre diminui constantemente, embora nada de novo seja iniciado no servidor e não haja novos usuários. Em algum momento ele começa a trocar, o carregamento no servidor sobe e ele não responde. Normalmente o que eu faço é apenas reiniciar o servidor ...

O que pode ser feito para detectar o que exatamente vaza memória? Eu uso top para monitorar o uso de recursos, mas, até onde eu vejo, não mostra nada útil:

Existe alguma maneira de descobrir o que usa essa quantidade de memória? ou o que começa a trocar para o disco pesadamente? Qualquer forma de liberar memória sem reiniciar o servidor?

    
por jayarjo 09.04.2011 / 20:43

4 respostas

15

A execução de top no modo em lote para relatar tamanhos de memória periodicamente pode ser usada para ver quem está usando a memória quando as coisas vão para o sul. A execução de sar no modo batch deve fornecer alguns bons diagnósticos sobre o uso de memória e E / S relacionadas. Executar munin para monitorar o sistema deve fornecer um gráfico com bons detalhes sobre o que a memória está sendo usada. Isso pode ajudar muito.

Você pode usar o limits.conf para limitar o tamanho máximo do núcleo dos programas. Corretamente definido, isso deve matar todos os programas que estão vazando memória. Isso funciona com o módulo pam_limits. Os limites também podem ser definidos com o comando ulimits .

Você está executando alguns programas que podem usar grandes quantidades de memória. Algumas coisas que você pode olhar incluem.

  • Aplicativos mal programados em execução sob apache2 podem vazar memória. Você deve ver o tamanho da memória aumentar quando isso acontece. Você pode ajustar o apache2 para reciclar as crianças após um determinado número de utilizações definindo MaxRequestsPerChild para 100 ou mais. Se isso resolver o problema, você precisará resolver o vazamento. Eu assisto isso primeiro.
  • O MySQL pode tentar carregar dados na memória. Se você tiver muitos dados na memória, isso pode causar uma surra, mas não deve ser tão dramático quanto você está vendo.
  • Se você tiver um grande sistema de arquivos tmpfs montado, poderá vazar memória se os arquivos não forem excluídos quando usados. Grandes arquivos de longa duração também podem ser um problema.
  • Se o problema ocorrer mais ou menos na mesma hora do dia, você pode ter um programa agendado que está vazando memória.
  • Se você tiver um programa que aloque memória compartilhada, mas não a liberte antes de sair, você terá um vazamento de memória relativamente invisível. Se a memória compartilhada estiver bloqueada na memória, ela poderá forçar a troca. A quantidade de memória compartilhada disponível é geralmente relativamente limitada.
  • O pacote liquidsoap + icecast pode ter problemas de buffer que usam memória. Eu não usei essa combinação, então não tenho certeza de como isso apareceria.

Uso normal da memória: A memória livre não é algo que você deseja muito. Se o seu sistema está funcionando há muito tempo e tem muita memória livre, algo está errado. Toda vez que você lê ou grava um arquivo, os blocos vão para o cache do buffer. Isso irá reduzir sua memória livre e é uma coisa boa. O sistema manterá espaço livre suficiente para iniciar alguns programas sem procurar em outro lugar por memória. Como muitos programas são executados rapidamente, sua memória será retornada ao pool livre quando eles pararem de executar.

Quando você lê um arquivo que está no cache de buffer, não é necessário acesso ao disco e a leitura é resolvida a partir do cache do buffer. As gravações usam um mecanismo semelhante. Se o seu sistema precisar de memória, o cache de buffer será um dos primeiros locais usados. A maioria dos buffers pode ser liberada imediatamente.

Se você tiver um vazamento de memória, verá memória livre e os buffers começarão a encolher. Este ainda não é um problema grave, pois a memória vazada deve eventualmente ser movida para o espaço de troca. Seu sistema ainda será executado corretamente até que você preencha o espaço de troca e reduza o espaço livre restante até o ponto em que os programas não possam ser iniciados. É típico que uma pequena quantidade de espaço de troca possa ser usada.

    
por 10.04.2011 / 02:50
11

Você pode usar este comando para ver os 10 principais aplicativos relacionados ao uso da RAM:

ps -A --sort -rss -o comm,pmem | head -n 11

Às vezes, esse comando ajuda se muitos subprocessos foram gerados:

ps auxf

Dessa forma, você pode ver quais processos pertencem juntos.

    
por 09.04.2011 / 21:03
8

Nada está realmente usando essa memória em termos de aplicativos.

Você precisa deduzir o valor 'em cache' que representa o cache da página para ter uma ideia melhor de qual é o uso real da memória em termos de uso do programa.

Basicamente, isso é um bom gerenciamento de memória e isso é idealmente o que você quer.

Veja o link aqui para mais informações: link

    
por 09.04.2011 / 22:29
0

Eu não sou profissional nisso, mas sabonete líquido + icecast é multimídia. Quando o sistema está livre, armazena em cache e / ou ocupa memória para uso futuro. E se o tráfego aumentar a uma certa hora do dia / durante um período de tempo, ele começará a trocar. Nesse ponto, se as solicitações (usuários visualizando conteúdo) aumentarem, os recursos necessários serão mais de 8 GB de RAM.

    
por 23.12.2017 / 19:36