MongoDB elimina OOM

MongoDB elimina OOM

Estamos ejecutando un conjunto de réplicas de mongodb en tres máquinas. Las tres máquinas tienen alrededor de 16 GB pero sólo 255 MB de intercambio. Swappiness se deja en su valor predeterminado 60. Las máquinas ejecutan CentOS 6.4. Las bases de datos son mucho más grandes que los 16 GB, pero eso está bien para nosotros. El conjunto que realmente funciona es mucho más pequeño.

El problema al que nos enfrentamos es que el consumo primario consume toda la memoria disponible y luego elimina OOM. Sé que esta es la forma en que mongodb gestiona la memoria.

Después de que el servidor elimine OOM, alguien tiene que reiniciarlo manualmente.

¿Hay alguna forma de evitar que mongodb elimine OOM? ¿Ajustar el intercambio? ¿Aumentar el espacio de intercambio? Creo que esas configuraciones solo aumentarán el período de gracia antes de que maten a mongod.

Respuesta1

El asesino OOM no es una formaalguiengestiona la memoria; ¡Es la forma del kernel de Linux de manejar fallas fatales como última esperanza para evitar el bloqueo del sistema!

Lo que debes hacer es:

  • Asegúrate de tener suficiente intercambio. Si está seguro, agregue más.

  • implementar límites de recursos! Al MENOS para las aplicaciones que espera que usen memoria (y más aún si no espera que lo hagan; esas generalmente terminan siendo problemáticas). Consulte los comandos ulimit -v (o limitar el espacio de direcciones) en su shell y colóquelos antes del inicio de la aplicación en su script de inicio. También debes limitar otras cosas (como la cantidad de procesos -u, etc.)... De esa manera, la aplicación obtendrá un error ENOMEM cuando no haya suficiente memoria, en lugar de que el kernel les proporcione memoria inexistente y luego se vuelva loco matando todo lo que hay a su alrededor. !

  • Dígale al kernel que no comprometa demasiado la memoria. Podrías hacerlo:

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

    o incluso mejor (dependiendo de la cantidad de espacio de intercambio)

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

    VerDesactivar el compromiso excesivopara más información sobre eso.

    Eso le indicaría al kernel que tenga más cuidado al darle a las aplicaciones memoria que realmente no tiene (la similitud con la crisis económica global del mundo es sorprendente)

  • Como último recurso, si todo lo que hay en su sistema, excepto MangoDB, es prescindible (¡pero primero arregle los dos puntos anteriores!), puede reducir elposibilidades de que lo maten(o incluso asegurándose de que no se elimine, incluso si la alternativa es colgar la máquina sin que nada funcione) ajustando /proc/$pid/oom_score_adj y/o /proc/$pid/oom_score.

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

    VerDomar al asesino OOMpara más información sobre ese tema.

información relacionada