La verdadera razón por la que no puede hacer lo que le pide (limitar la memoria) es porque MongoDB no administra la memoria que usa directamente, permite que el sistema operativo lo haga. MongoDB solo asigna mapas de memoria a todos sus datos y luego hace que el sistema operativo ingrese y salga de la memoria según sea necesario. Como resultado, no existe una administración directa de la cantidad utilizada posible hasta que MongoDB implemente esto de una manera completamente diferente, o el sistema operativo lo permita (no es posible en Linux desde los 2.4 días).
La única forma de segregar realmente los recursos en la actualidad es usar una solución de virtualización y aislar MongoDB en su propia VM. Sí, hay gastos generales involucrados (aunque los hipervisores han mejorado mucho), pero en este momento ese es el precio a pagar por ese nivel de control de recursos.
En términos de OOM Killer, incluso sin otros procesos en el host, siempre que su conjunto de datos e índices excedan en general la memoria disponible, MongoDB puede atacar los problemas de OOM Killer. Esto se debe a cómo se paginan los datos de la memoria: si no hay presión de memoria (nada más quiere memoria Residente), y sigue agregando / tocando nuevos datos e índices, eventualmente crecerá para consumir toda la RAM disponible. De ahí la recomendación de configurar siempre algún intercambio cuando se ejecuta MongoDB:
https://docs.mongodb.com/manual/administration/production-notes/#swap
Por supuesto, los datos de LRU se paginarán primero, otros procesos también pueden ocupar la memoria, pero el concepto aún se aplica a menos que cargue su conjunto de datos en la memoria y luego permanezca estático. Lo mejor que puede hacer si está preocupado es ingresarlo a MMS y rastrear el uso a lo largo del tiempo:
http://mms.mongodb.com
Actualización: agosto de 2015
Desde que escribí esta respuesta, las cosas han avanzado un poco y la información está un poco desactualizada. Por ejemplo, Linux ahora tiene cgroups y tecnologías relacionadas ( contenedores Docker, por ejemplo) que han madurado hasta el punto de que le permiten aislar y limitar mejor los recursos ( incluida la memoria ) consumidos por cualquier proceso en un entorno de producción, incluso uno que use mapeo de memoria como MongoDB.
Además, con la llegada de nuevos motores de almacenamiento más allá de MMAP como WiredTiger en MongoDB 3.0+, puede usar la funcionalidad incorporada para limitar el tamaño de caché para MongoDB. Por lo tanto, los requisitos de RAM ahora realmente dependen de cómo elija configurar MongoDB, en qué entorno lo ejecute y qué motor de almacenamiento elija.
MongoDB utilizará la memoria libre disponible para el almacenamiento en caché y cambiará al disco según sea necesario para ceder memoria a otras aplicaciones en el mismo servidor. Para obtener el mejor rendimiento, querrá tener suficiente RAM para mantener sus índices y datos de uso frecuente ("conjunto de trabajo") en la memoria.
Lectura útil:
fuente
Algunas cosas han cambiado en años sobre MongoDB.
TL; DR
Si se utiliza el motor de almacenamiento MMAPv1 en MongoDB, el
working set
tamaño debe caber en la RAM . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ramSi se utiliza el motor de almacenamiento WiredTiger en MongoDB, no es necesario preocuparse por si la RAM es apta
working set
o no . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-enginefuente