¿Hay alguna opción para limitar el uso de la memoria mongodb?

Estoy usando Mongo-DBv1.8.1. La memoria de mi servidor es de 4 GB, pero Mongo-DB está utilizando más de 3 GB. ¿Hay una opción de limitación de memoria en Mongo-DB ?.

Esta pregunta ha sido hecha un par de veces …

Consulte esta pregunta / respuesta relacionada (citada a continuación) … ¿cómo liberar el almacenamiento en caché que utiliza Mongodb?


MongoDB usará (al menos parecer) una gran cantidad de memoria disponible, pero en realidad deja que el VMM del sistema operativo le indique que libere la memoria (consulte Almacenamiento en caché en los documentos de MongoDB).

Debería poder liberar cualquier memoria reiniciando MongoDB.

Sin embargo, hasta cierto punto, MongoDB no está realmente “usando” la memoria.

Por ejemplo, desde los documentos de MongoDB Comprobación del uso de la memoria del servidor …

Dependiendo de la plataforma, puede ver los archivos asignados como memoria en el proceso, pero esto no es estrictamente correcto. La parte superior de Unix puede mostrar mucha más memoria para mongod de lo que realmente es apropiado. El sistema operativo (el administrador de memoria virtual específicamente, según el sistema operativo) administra la memoria donde residen los “archivos asignados de memoria”. Este número generalmente se muestra en un progtwig como “free -lmt”.

Se llama memoria “en caché”.

MongoDB utiliza el algoritmo de caché LRU ( Least Used ) para determinar qué “páginas” para lanzar, encontrará más información en estas dos preguntas …

  • Memoria de límite MongoDB
  • Relación índice / RAM de MongoDB
  • Mongod comienza con límite de memoria ( no puedes )

Comenzando en 3.2, MongoDB usa WiredTiger como el motor de almacenamiento predeterminado. Las versiones anteriores usaban el MMAPv1 como el motor de almacenamiento predeterminado.

  • Con WiredTiger, MongoDB utiliza la memoria caché interna de WiredTiger y la memoria caché del sistema de archivos.
  • En MongoDB 3.2, el caché interno de WiredTiger, por defecto, usará el más grande de cualquiera: 60% de RAM menos 1 GB o 1 GB.
  • Para sistemas con hasta 10 GB de RAM, la nueva configuración predeterminada es menor o igual a la configuración predeterminada de 3.0 (para MongoDB 3.0, la memoria caché interna de WiredTiger utiliza 1 GB o la mitad de la RAM física instalada, la que sea mayor). Para sistemas con más de 10 GB de RAM, la nueva configuración predeterminada es mayor que la configuración 3.0.

para limitar la memoria caché activada por cable Agregue la siguiente línea al archivo .config:

wiredTigerCacheSizeGB = 1

Si está ejecutando mongodb 3.2+, puede limitar la caché wiredTiger como se mencionó anteriormente.

En /etc/mongod.conf agrega la parte wiredTigre

 ... # Where and how to store data. storage: dbPath: /var/lib/mongodb journal: enabled: true wiredTiger: engineConfig: cacheSizeGB: 1 ... 

Esto limitará el tamaño de la caché a 1 Gb, más información en los muelles

Esto resolvió el problema para mí, ejecutando ubuntu 16.04 y mongoDB 3.2

Puede limitar el uso del proceso mongod usando cgroups en Linux.

Usando cgroups, nuestra tarea se puede lograr en unos sencillos pasos.

  1. Crear grupo de control:

     cgcreate -g memory:DBLimitedGroup 

    (asegúrese de que los binarios de cgroups instalados en su sistema, consulte su manual de distribución de Linux favorito para saber cómo hacerlo)

  2. Especifique la cantidad de memoria disponible para este grupo:

     echo 16G > /sys/fs/cgroup/memory/DBLimitedGroup/memory.limit_in_bytes 

    Este comando limita la memoria a 16G (bueno, esto limita la memoria tanto para las asignaciones malloc como para la memoria caché del sistema operativo)

  3. Ahora, será una buena idea eliminar las páginas que ya permanecieron en la caché:

     sync; echo 3 > /proc/sys/vm/drop_caches 
  4. Y finalmente asigne un servidor al grupo de control creado:

     cgclassify -g memory:DBLimitedGroup \`pidof mongod\` 

    Esto asignará un proceso mongod en ejecución a un grupo limitado por solo 16 GB de memoria.

fuente: Uso de Cgroups para limitar el uso de memoria de MySQL y MongoDB

No creo que pueda configurar cuánta memoria usa MongoDB, pero está bien (lea a continuación).

Para citar de la fuente oficial :

El tamaño de la memoria virtual y el tamaño del residente parecerán ser muy grandes para el proceso de mongod. Esto es benigno: el espacio de la memoria virtual será más grande que el tamaño de los archivos de datos abiertos y mapeados; el tamaño del residente variará según la cantidad de memoria no utilizada por otros procesos en la máquina.

En otras palabras, Mongo permitirá que otros progtwigs usen memoria si lo solicitan.

Para Windows, parece posible controlar la cantidad de memoria que utiliza MongoDB, consulte este tutorial en Captain Codeman:

Limite el uso de la memoria MongoDB en Windows sin virtualización

En realidad, hay un par de trucos para limitar la memoria, como en Windows, puede usar el Administrador de recursos del sistema de Windows (WSRM) , pero generalmente Mongo funciona mejor en un servidor dedicado cuando es libre de usar memoria sin mucha disputa con otros sistemas.

Aunque el sistema operativo intentará asignar memoria a otros procesos según lo necesiten, en la práctica esto puede generar problemas de rendimiento si otros sistemas también tienen requisitos de memoria elevados.

Si realmente necesita limitar la memoria y solo tiene un solo servidor, entonces su mejor apuesta es la virtualización.

Esto se puede hacer con cgroups, combinando el conocimiento de estos dos artículos: https://www.percona.com/blog/2015/07/01/using-cgroups-to-limit-mysql-and-mongodb-memory-usage /
http://frank2.net/cgroups-ubuntu-14-04/

Aquí puede encontrar un pequeño script de shell que creará archivos de configuración e init para Ubuntu 14.04: http://brainsuckerna.blogspot.com.by/2016/05/limiting-mongodb-memory-usage-with.html

Así:

 sudo bash -c 'curl -o- http://brains.by/misc/mongodb_memory_limit_ubuntu1404.sh | bash' 

Una cosa que puedes limitar es la cantidad de memoria que usa mongodb al construir índices. Esto se establece utilizando la configuración maxIndexBuildMemoryUsageMegabytes . Un ejemplo de cómo se establece a continuación:

mongo --eval "db.adminCommand( { setParameter: 1, maxIndexBuildMemoryUsageMegabytes: 70000 } )"