MongoDB ficando OOM morto

5

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. O Swappiness é deixado no seu valor padrão 60. As máquinas estão rodando o CentOS 6.4. Os bancos de dados são muito maiores que os 16 GB, mas isso é ok para nós. O conjunto realmente funcional é muito menor.

O problema que estamos enfrentando é que os consumos primários consomem toda a memória disponível e obtêm o OOM-Killed. Eu sei que é assim que o mongodb gerencia a memória.

Depois que o servidor está ficando OOM morto alguém tem que reiniciá-lo manualmente.

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

    
por bjoernhaeuser 07.09.2013 / 19:37

1 resposta

6

O killer da OOM não é uma forma qualquer pessoa gerencia a memória; é a maneira dos kernels Linux lidar com falhas fatais na última esperança para evitar o travamento do sistema!

O que você deve fazer é:

  • verifique se você tem swap suficiente. Se tiver certeza, ainda adicione mais.

  • implemente limites de recursos! Pelo menos para as aplicações que você espera que usem memória (e ainda mais se você não espera que elas aconteçam - essas geralmente acabam sendo problemáticas). Veja os comandos ulimit -v (ou limit addressspace) em seu shell e coloque-o antes da inicialização do aplicativo em seu script de inicialização. Você também deve limitar outras coisas (como 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 dar a eles memória inexistente e depois ficar berserk matando tudo !

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

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

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

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

    Veja Desativando o comprometimento excessivo para obter mais informações sobre isso.

    Isso instruiria o kernel a ter mais cuidado ao dar memória aos aplicativos que ele realmente não tem (a semelhança com a crise econômica mundial é impressionante)

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

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

    Veja Domar o assassino de OOM para mais informações sobre esse assunto.

por 08.09.2013 / 02:16