J'ai la configuration suivante:
- une machine hôte qui exécute trois conteneurs Docker:
- MongoDB
- Redis
- Un programme utilisant les deux conteneurs précédents pour stocker des données
Redis et MongoDB sont utilisés pour stocker d'énormes quantités de données. Je sais que Redis doit conserver toutes ses données dans la RAM et je suis d'accord avec cela. Malheureusement, ce qui se passe, c'est que Mongo commence à prendre beaucoup de RAM et dès que la RAM hôte est pleine (nous parlons de 32 Go ici), Mongo ou Redis se bloque.
J'ai lu les questions précédentes suivantes à ce sujet:
- Limiter l'utilisation de la RAM MongoDB : apparemment, la plupart de la RAM est utilisée par le cache WiredTiger
- MongoDB limit memory : ici, apparemment, le problème était les données de journal
- Limitez l'utilisation de la mémoire RAM dans MongoDB : ici, ils suggèrent de limiter la mémoire de mongo afin qu'il utilise une plus petite quantité de mémoire pour son cache / journaux / données
- MongoDB utilise trop de mémoire : ici, ils disent que c'est le système de mise en cache WiredTiger qui a tendance à utiliser autant de RAM que possible pour fournir un accès plus rapide. Ils déclarent également
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- Existe-t-il une option pour limiter l'utilisation de la mémoire mongodb? : mise en cache à nouveau, ils ajoutent également
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
- Relation index MongoDB / RAM : citation:
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.
- comment libérer la mise en cache utilisée par MongoDB? : même réponse qu'en 5.
Maintenant, ce que je semble comprendre de toutes ces réponses, c'est que:
- Pour un accès plus rapide, il serait préférable que mongo adapte tous les indices dans la RAM. Cependant, dans mon cas, je suis d'accord avec les index résidant partiellement sur le disque car j'ai un SSD assez rapide.
- La RAM est principalement utilisée pour la mise en cache par mongo.
Compte tenu de cela, je m'attendais à ce que mongo essaie d'utiliser autant d'espace RAM que possible, mais puisse également fonctionner avec peu d'espace RAM et aller chercher la plupart des choses sur le disque. Cependant, j'ai limité la mémoire du conteneur mongo Docker (à 8 Go par exemple), en utilisant --memory
et --memory-swap
, mais au lieu de récupérer des choses sur le disque, mongo s'est juste écrasé dès qu'il manquait de mémoire.
Comment puis-je forcer mongo à utiliser uniquement la mémoire disponible et à récupérer sur le disque tout ce qui ne tient pas en mémoire?
dmesg
corrélation avec l'arrêt inattendu? La possibilité la plus probable avec Docker est que les processus dans le conteneur détectent la RAM globale disponible plutôt que la limite du conteneur.
mongod
dans un récipient ( lxc
, cgroups
, Docker, etc.) qui ne pas avoir accès à toute la RAM disponible dans un système, vous devez définir storage.wiredTiger.engineConfig.cacheSizeGB
une valeur inférieure à la quantité de RAM disponible en le conteneur. Le montant exact dépend des autres processus en cours d'exécution dans le conteneur, mais ne doit généralement pas être supérieur à la valeur par défaut de 50% de RAM moins 1 Go.