J'ai la configuration suivante:
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 RAM et je suis d'accord avec cela. Malheureusement, ce qui se passe est que mongo commence à prendre beaucoup de RAM et dès que l'hôte RAM est plein (nous parlons de 32 Go ici)), Mongo ou Redis plante.
J'ai lu les questions précédentes suivantes à ce sujet:
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
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
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.
Maintenant, ce que je semble comprendre de toutes ces réponses, c'est que:
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 RAM espace et récupérer la plupart des choses de Cependant, j'ai limité la mémoire du conteneur mongo Docker (à 8 Go par exemple), en utilisant --memory
et --memory-swap
, mais au lieu d'aller chercher des trucs sur le disque, mongo s'est juste écrasé dès qu'il était épuisé. de la 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?
Selon MongoDB BOL ici Modifié dans la version 3.4: Les valeurs peuvent aller de 256MB
à 10TB
et peut être un float
. De plus, la valeur par défaut a également changé.
À partir de 3.4
, le cache interne WiredTiger , par défaut, utilisera le plus grand des deux:
50% of RAM minus 1 GB, or
256 MB.
Avec WiredTiger
, MongoDB utilise à la fois le WiredTiger internal cache
et le filesystem cache
.
Via le filesystem cache
, MongoDB utilise automatiquement toute la mémoire libre qui n'est pas utilisée par le WiredTiger cache
ou par d'autres processus.
Le storage.wiredTiger.engineConfig.cacheSizeGB limite la taille du cache interne WiredTiger
. Le système d'exploitation utilisera la mémoire libre disponible pour le cache du système de fichiers, ce qui permet aux fichiers de données MongoDB compressés de rester en mémoire. De plus, le operating system
utilisera n'importe quel RAM pour tamponner les blocs du système de fichiers et le cache du système de fichiers).
Pour accueillir les consommateurs supplémentaires de [~ # ~] ram [~ # ~] , vous devrez peut-être réduire WiredTiger
la taille du cache interne .
Pour plus d'informations, réf WiredTiger Storage Engine et Options du fichier de configuration
En fait, si vous regardez de plus près, ce n'est pas le mongod qui meurt pour "mémoire insuffisante", c'est le gestionnaire OOM (hors mémoire) du noyau qui tue le mongod, car il a la plus grande utilisation de la mémoire.
Oui, vous pouvez essayer de résoudre le problème avec le paramètre de configuration monngodb cacheSizeGB , mais dans l'environnement de conteneur, il est préférable d'utiliser cgroups pour limiter les ressources que n'importe lequel de vos trois les conteneurs obtiennent.