Como saber a causa de um erro oom no Linux

1

Eu tenho um servidor web de teste.

Uma vez o servidor ficou sem resposta, tive que reiniciá-lo.

Visualizando os logs, pude ver que o servidor estava fora, se a memória e o oom killer matassem o mysqld.

Mas lendo alguns documentos sobre o oom killer eu sei que o mysqld não era necessariamente (mas talvez fosse) a causa da situação de falta de memória.

Então, apenas usando os arquivos de log, posso saber que processo (es) causou a condição original?

    
por Cesar 14.11.2009 / 22:01

6 respostas

2

Como você define a "causa" da situação da OOM? É o processo que usa mais memória? Talvez você tenha um banco de dados que sempre precise de 3 GB de memória para rodar e, assim, use a maior parte da memória da máquina. É a "causa" do problema? Provavelmente não.

Em última análise, a causa do problema é "Uma situação inesperada que pode ou não ter sido culpa do administrador do sistema".

Às vezes você pode saber; por exemplo, se você tivesse a configuração de contabilidade do processo (+ 1 to @JamesHannah) e você visse 3000 processos httpd ou sshd (e isso era incomum), provavelmente você poderia culpar o daemon.

Com isso em mente, apresento comentários da The Source:

/*
 * oom_badness - calculate a numeric value for how bad this task has been
 * @p: task struct of which task we should calculate
 * @p: current uptime in seconds
 *
 * The formula used is relatively simple and documented inline in the
 * function. The main rationale is that we want to select a good task
 * to kill when we run out of memory.
 *
 * Good in this context means that:
 * 1) we lose the minimum amount of work done
 * 2) we recover a large amount of memory
 * 3) we don't kill anything innocent of eating tons of memory
 * 4) we want to kill the minimum amount of processes (one)
 * 5) we try to kill the process the user expects us to kill, this
 *    algorithm has been meticulously tuned to meet the principle
 *    of least surprise ... (be careful when you change it)
 */

"Portanto, o candidato ideal para a liquidação é um processo recentemente iniciado, não privilegiado, que junto com seus filhos usa muita memória, foi legal, e não faz E / S não processada. Algo semelhante a um kernel paralelo nohup'd build (que não é uma má escolha, pois todos os resultados são salvos em disco e muito pouco trabalho é perdido quando um 'make' é finalizado). "

Bloco de comentários e citação descarada roubada de link

    
por 14.11.2009 / 22:51
1

Você pode ver quais processos (com pid) foram considerados pelo killer da OOM e quais foram realmente mortos executando dmesg . mas eu não sei como fazer isso ir para um arquivo de log.

    
por 14.11.2009 / 22:11
1

Só é realmente possível se você tivesse algum tipo de software forense instalado antes do incidente, algo como sysstat, psacct ou similar. Caso contrário, você está no escuro.

    
por 14.11.2009 / 22:15
1

Como foi sugerido antes, algo como o psacct é perfeito para essa situação com sobrecarga mínima. Eu uso no topo e deixo os troncos ficarem por pelo menos um ano. Isso não equivale a muitos dados e permite rastrear todos os tipos de coisas interessantes que você pode criar depois do fato. link

O padrão é fatias de tempo de 5 minutos e isso funciona bem para rastrear o motivo da falta de memória do servidor. A melhor coisa sobre isso é tipicamente que você pode voltar a quando o processo começou a crescer na memória e, em seguida, examinar os pontos no log que podem sugerir o que estava acontecendo com esse aplicativo em particular.

    
por 15.11.2009 / 04:04
0

Recentemente, tivemos esse problema com um convidado do RHEL em execução no VMware. Se você estiver na mesma situação, confira o seguinte artigo da base de conhecimento da VMware: link

    
por 15.11.2009 / 00:39
0

Como um aparte, se este é um problema recorrente e você quer ser capaz de diagnosticar a causa no futuro, uma técnica que usamos no passado é criar um arquivo de swap muito maior usando:

link

Obviamente, isso não resolverá o problema, mas deverá dar a você tempo suficiente para entrar e diagnosticar a causa antes que a máquina fique sem memória e pare de funcionar.

    
por 15.11.2009 / 02:43

Tags