MongoDB matando OOM

MongoDB matando OOM

estamos executando um replicaset mongodb em três máquinas. Todas as três máquinas têm cerca de 16 GB, mas apenas 255 MB de Swap. A troca é deixada com o valor padrão 60. As máquinas estão executando o CentOS 6.4. Os bancos de dados são muito maiores que 16 GB, mas para nós está tudo bem. O conjunto realmente funcional é muito menor.

O problema que estamos enfrentando é que o consumo primário consome toda a memória disponível e acaba com o OOM. Eu sei que é assim que o mongodb gerencia a memória.

Depois que o servidor é eliminado do OOM, alguém precisa reiniciá-lo manualmente.

Existe alguma maneira de evitar que o mongodb mate o OOM? Ajustar a troca? Aumentar o espaço de troca? Acho que essas configurações apenas aumentarão o período de carência antes que o mongod seja morto.

Responder1

O assassino OOM não é um caminhoqualquer umgerencia a memória; é a maneira do kernel do Linux lidar com falhas fatais na última esperança de evitar o travamento do sistema!

O que você deve fazer é:

  • certifique-se de ter troca suficiente. Se você tiver certeza, adicione mais.

  • implementar limites de recursos! PELO MENOS para aplicativos que você espera que usem memória (e ainda mais se você não espera que o façam - esses geralmente acabam sendo problemáticos). Veja os comandos ulimit -v (ou limit addressspace) em seu shell e coloque-os antes da inicialização do aplicativo em seu script de inicialização. Você também deve limitar outras coisas (como o número de processos -u, etc)... Dessa forma, o aplicativo receberá o erro ENOMEM quando não houver memória suficiente, em vez do kernel fornecer memória inexistente e depois enlouquecer matando tudo ao redor !

  • diga ao kernel para não sobrecarregar a memória. Você poderia fazer:

    echo "0" > /proc/sys/vm/overcommit_memory

    ou ainda melhor (dependendo da quantidade de espaço de troca)

    echo "2" > /proc/sys/vm/overcommit_memory; echo "80" > /proc/sys/vm/overcommit_ratio

    VerDesativando o excesso de comprometimentopara mais informações sobre isso.

    Isso instruiria o kernel a ter mais cuidado ao fornecer aos aplicativos memória que ele realmente não possui (a semelhança com a crise econômica global do mundo é impressionante).

  • como último recurso, se tudo em seu sistema, exceto MangoDB, for dispensável (mas corrija dois pontos acima primeiro!) você pode diminuir ochances de ele ser morto(ou mesmo certificando-se de que ele não será eliminado - mesmo que a alternativa seja desligar a máquina sem nada funcionar) ajustando /proc/$pid/oom_score_adj e/ou /proc/$pid/oom_score.

    echo "-1000" > /proc/`pidof mangod`/oom_score_adj

    VerDomando o assassino OOMpara mais informações sobre esse assunto.

informação relacionada