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

16

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

O servidor possui 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, a carga no servidor aumenta e deixa de responder. Normalmente, o que 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, tanto quanto vejo, não mostra nada útil:

insira a descrição da imagem aqui

Existe alguma maneira de descobrir o que usa tanta memória? ou o que começa a trocar fortemente para o disco? Alguma maneira de liberar memória sem reiniciar o servidor?

jayarjo
fonte
Qualquer razão para você não tentar reiniciar alguns dos serviços (apache, liquidsoap) em vez do servidor?
jamespo
Inicialmente, respondi pelo uso normal da memória. Atualizei com um conjunto de ferramentas que podem ajudar a identificar o problema.
BillThor
@ Jamespo, na verdade eu tentei isso, mas não teve efeito, então reiniciar era a única coisa que eu sabia que poderia ajudar.
Jayarjo 10/04
O 4027092k em cache deve explicar o uso da memória, não? No momento, estou trabalhando em um problema semelhante em outro lugar, e até agora consegui descobrir que a transferência de memória pode ser regulada com os seguintes parâmetros: vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratio Essa não é uma correção completa e nenhum feedback muito bem-vindo. Espero que seja a direção certa a seguir.

Respostas:

16

A execução topno 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 sarno modo em lote deve fornecer bons diagnósticos sobre o uso da memória e E / S relacionadas. A execução muninpara monitorar o sistema deve fornecer um gráfico com bons detalhes sobre o uso da memória. Isso pode ajudar bastante.

Você pode usar o limits.conf para limitar o tamanho máximo do núcleo dos programas. Definido corretamente, 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 ulimitscomando

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

  • Os aplicativos mal programados em execução apache2podem vazar memória. Você deve ver o tamanho da memória aumentar quando isso acontece. Você pode ajustar o apache2 para reciclar filhos após um certo número de usos, definindo MaxRequestsPerChildpara 100 ou mais. Se isso resolver o problema, será necessário resolver o vazamento. Eu assistiria isso primeiro.
  • O MySQL pode tentar carregar dados na memória. Se você tem muitos dados na memória, isso pode causar algum problema, mas não deve ser tão dramático quanto você está vendo.
  • Se você tiver um tmpfssistema de arquivos grande montado, poderá vazar memória se os arquivos não forem excluídos quando usados. Arquivos grandes e de longa duração também podem ser um problema.
  • Se o problema ocorrer aproximadamente na mesma hora do dia, você pode ter um programa agendado que está vazando memória.
  • Se você possui um programa que aloca memória compartilhada, mas não a libera antes de sair, haverá um vazamento de memória relativamente invisível. Se a memória compartilhada estiver bloqueada na memória, 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. Como não usei essa combinação, não tenho certeza de como isso seria exibido.

Uso normal da memória: A memória livre não é algo que você deseja muito. Se o seu sistema estiver em funcionamento há muito tempo e tiver muita memória livre, algo está errado. Toda vez que você lê ou grava um arquivo, os blocos entram no cache do buffer. Isso reduzirá sua memória livre e é uma coisa boa. O sistema manterá espaço livre suficiente para iniciar alguns programas sem procurar memória em outro lugar. 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 do buffer, nenhum acesso ao disco é necessário e a leitura é resolvida no cache do buffer. As gravações usam um mecanismo semelhante. Se o seu sistema precisar de memória, o cache do buffer será um dos primeiros locais usados. A maioria dos buffers pode ser liberada imediatamente.

Se houver um vazamento de memória, você verá a memória livre e os buffers começarem a encolher. Isso ainda não é um problema grave, pois a memória vazada deve ser movida para trocar espaço. Seu sistema ainda funcionará bem até você preencher o espaço de troca e reduzir o espaço livre restante até o ponto em que os programas não podem ser iniciados. É típico que uma pequena quantidade de espaço de troca possa ser usada.

BillThor
fonte
O problema no meu caso é meio estranho. Mesmo quando a carga é enorme e o servidor troca muito, há muita memória livre (como eu entendi depois de ler sobre buffers e caches). top não mostra nenhum processo que consome memória cada vez mais. Mas a carga aumenta e, em algum momento, o servidor se torna inutilizável: | Obrigado pela resposta detalhada.
Jayarjo
2
@jayarjo: Munin e sar devem ajudar a detectar o que está acontecendo. Se você tem muita memória livre, não deve trocar. Você pode ter um problema de E / S diferente. sarajudará a identificar qual partição possui a E / S e pode ajudar a descobrir o problema.
BillThor
+1 para MaxRequestsPerChild conselhos
jamespo
11

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

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

Às vezes, este comando ajuda você se muitos subprocessos foram gerados:

ps auxf

Dessa forma, você pode ver quais processos pertencem um ao outro.

Raffael Luthiger
fonte
Estes são comandos úteis, obrigado. Vou anotá-los para o futuro. Mas o problema é que sempre existem os mesmos processos no topo (você pode vê-los na captura de tela em anexo) - apache, mysql, liquidsoap, icecast. E eles usam (ou pelo menos é mostrado que usam) a mesma quantidade de memória (realmente desprezível), mesmo quando o servidor está morrendo de carga: |
Jayarjo
@ jayarjo: O número de processos muda? Você tem muito mais processos? E é um servidor físico ou virtual?
Raffael Luthiger
Não notei nenhuma alteração no número de processos. Basicamente, quando estou no topo, enquanto o servidor está morrendo de carga, vejo uma imagem muito semelhante à anexada na pergunta original, exceto a enorme carga: | Servidor é físico.
Jayarjo
2
Tente obter mais informações com "vmstat" (por exemplo, vmstat -s). Ou com a ferramenta "sar" já mencionada. Você talvez possui um sistema de arquivos baseado em RAM? Então talvez o "iostat" também possa fornecer mais informações.
Raffael Luthiger
11
Eu tenho dúvidas se o campo "pmem" (% MEM) de entrada psou topsaída é a coisa certa a se procurar ao tentar detectar um vazamento de memória: não é apenas a porcentagem da memória física que o processo está usando atualmente? Mas outras partes da memória usada do processo (incluindo vazamento) podem ser trocadas. Talvez "tamanho" ou "vsize" seja mais apropriado para medir o tamanho de um processo? Por exemplo, ps -A --sort -size -o comm,size | head -n 11oups -A --sort -vsize -o comm,vsize | head -n 11
imz - Ivan Zakharyaschev 29/07
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 idéia melhor do uso real da memória em termos de uso do programa.

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

Veja o link aqui para obter mais informações: http://www.linuxatemyram.com/

Matthew Ife
fonte
sim, encontrei esse link e li sobre buffers e caches, mas, tanto quanto pude obter pelo que li, eles não podem causar trocas, podem?
Jayarjo
@ Jayayjo Acho que para entender o que acontece, precisaríamos de estatísticas que demonstrassem o problema. Os números que você forneceu não mostram troca ou muito uso de memória real.
Matthew Ife
1

Eu realmente não sou profissional nisso, mas sabão líquido + icecast estão relacionados a multimídia. Quando o sistema está livre, ele armazena em cache e / ou ocupa memória para uso futuro. E se o tráfego aumentar a uma determinada 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.

Yash
fonte