MongoDB: requisitos de RAM


20

¿Es suficiente tener todo el índice en memoria / ram o mongodb incluso intenta asignar la mayor cantidad de ram posible para almacenar incluso los datos para lecturas rápidas?

Me gustaría ejecutar mongodb + otras aplicaciones y parece que mongodb es la única que no me permite definir un rango de RAM, digamos "max_memory_allocated_or_reserved = 8GB".

Si no hay forma de hacerlo, debería explicarle a Oom-Killer que mongod es el proceso "malo" que no es la mejor práctica en mi opinión ...

Respuestas:


18

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.


con respecto a WiredTiger: "storage.wiredTiger.engineConfig.cacheSizeGB solo limita el tamaño de la memoria caché WiredTiger, no la cantidad total de memoria utilizada por mongod. La memoria caché WiredTiger es solo un componente de la memoria RAM utilizada por MongoDB. MongoDB también usa automáticamente todos memoria libre en la máquina a través del caché del sistema de archivos ... "
Stefan Rogin

bien, pero lo mismo puede decirse de cualquier aplicación que pagina datos del disco, el caché FS ya no es el método de almacenamiento en caché primario para los datos, como lo era antes con los archivos mapeados en memoria en el motor de almacenamiento MMAP
Adam C

6

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:


3

Algunas cosas han cambiado en años sobre MongoDB.

TL; DR

Si se utiliza el motor de almacenamiento MMAPv1 en MongoDB, el working settamaño debe caber en la RAM . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram

Si se utiliza el motor de almacenamiento WiredTiger en MongoDB, no es necesario preocuparse por si la RAM es apta working seto no . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine

Diagnóstico de memoria para el motor de almacenamiento WiredTiger

¿Debe el tamaño de mi conjunto de trabajo adaptarse a la RAM?

No.

¿Cómo calculo la cantidad de RAM que necesito para mi aplicación?

Con WiredTiger, MongoDB utiliza tanto la caché interna de WiredTiger como la caché del sistema de archivos.

Cambiado en la versión 3.2: a partir de MongoDB 3.2, la memoria caché interna de WiredTiger, por defecto, utilizará el más grande de:

60% de RAM menos 1 GB o 1 GB.


Bueno, esta respuesta no es de mucha ayuda, ni terriblemente precisa.
Philip Schiff
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.