Tengo la siguiente configuración:
- una máquina host que ejecuta tres contenedores acoplables:
- MongoDB
- Redis
- Un programa que usa los dos contenedores anteriores para almacenar datos
Tanto Redis como MongoDB se utilizan para almacenar grandes cantidades de datos. Sé que Redis necesita mantener todos sus datos en RAM y estoy de acuerdo con esto. Desafortunadamente, lo que sucede es que Mongo comienza a tomar mucha RAM y tan pronto como la RAM del host está llena (estamos hablando de 32 GB aquí), Mongo o Redis se bloquean.
He leído las siguientes preguntas anteriores sobre esto:
- Limite el uso de RAM MongoDB : aparentemente, la mayor parte de la RAM es utilizada por la caché WiredTiger
- Memoria límite de MongoDB : aquí aparentemente el problema eran los datos de registro
- Limite el uso de memoria RAM en MongoDB : aquí sugieren limitar la memoria de mongo para que use una menor cantidad de memoria para su caché / registros / datos
- MongoDB usa demasiada memoria : aquí dicen que es el sistema de almacenamiento en caché WiredTiger que tiende a usar tanta RAM como sea posible para proporcionar un acceso más rápido. También declaran
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- ¿Hay alguna opción para limitar el uso de memoria mongodb? : caché de nuevo, también agregan
MongoDB uses the LRU (Least Recently Used) cache algorithm to determine which "pages" to release, you will find some more information in these two questions
- Relación MongoDB índice / RAM : cita:
MongoDB keeps what it can of the indexes in RAM. They'll be swaped out on an LRU basis. You'll often see documentation that suggests you should keep your "working set" in memory: if the portions of index you're actually accessing fit in memory, you'll be fine.
- ¿Cómo liberar el almacenamiento en caché que utiliza MongoDB? : misma respuesta que en 5.
Ahora, lo que parece entender de todas estas respuestas es que:
- Para un acceso más rápido, sería mejor para mongo ajustar todos los índices en la RAM. Sin embargo, en mi caso, estoy bien con índices que residen parcialmente en el disco ya que tengo un SSD bastante rápido.
- RAM es utilizada principalmente para el almacenamiento en caché por mongo.
Teniendo en cuenta esto, esperaba que Mongo intentara usar la mayor cantidad de espacio de RAM posible, pero también podría funcionar con poco espacio de RAM y recuperar la mayoría de las cosas del disco. Sin embargo, limité la memoria del contenedor mongo Docker (a 8GB por ejemplo), usando --memory
y --memory-swap
, pero en lugar de buscar cosas del disco, mongo se bloqueó tan pronto como se quedó sin memoria.
¿Cómo puedo obligar a mongo a usar solo la memoria disponible y a buscar del disco todo lo que no cabe en la memoria?
dmesg
correlacionado con el apagado inesperado? La posibilidad más probable con Docker es que los procesos en el contenedor detecten la RAM total disponible en lugar del límite del contenedor.
mongod
en un contenedor ( lxc
, cgroups
, estibador, etc.) eso no tienen acceso a toda la memoria RAM disponible en el sistema, debe establecer storage.wiredTiger.engineConfig.cacheSizeGB
a un valor inferior a la cantidad de RAM disponible en El contenedor. La cantidad exacta depende de los otros procesos que se ejecutan en el contenedor, pero normalmente no debería ser mayor que el valor predeterminado del 50% de RAM menos 1 GB.