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.