web-dev-qa-db-fra.com

MongoDB se termine lorsqu'il manque de mémoire

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 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:

  1. Limit MongoDB RAM Usage : apparemment la plupart RAM est utilisé par le cache WiredTiger)
  2. mémoire limite MongoDB : ici, apparemment, le problème était les données de journal
  3. 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
  4. MongoDB utilisant trop de mémoire : ici, ils disent que c'est le système de mise en cache WiredTiger qui a tendance à utiliser autant RAM que possible pour fournir un accès plus rapide. Ils indiquent également it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
  5. Existe-t-il une option pour limiter l'utilisation de la mémoire de mongodb? : à nouveau en cache, 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
  6. 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.
  7. comment libérer le cache utilisé par MongoDB? : même réponse qu'en 5.

Maintenant, ce que je semble comprendre de toutes ces réponses, c'est que:

  1. 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.
  2. 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 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?

11
Simone Bronzini

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

9
Md Haidar Ali Khan

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.

4
JJussi