web-dev-qa-db-fra.com

Existe-t-il une option pour limiter l'utilisation de la mémoire mongodb?

J'utilise Mongo-DBv1.8.1. La mémoire de mon serveur est de 4 Go mais Mongo-DB utilise plus de 3 Go. Existe-t-il une option de limitation de la mémoire dans Mongo-DB?.

51
kumar_88

À partir de la version 3.2, MongoDB utilise WiredTiger comme moteur de stockage par défaut. Les versions précédentes utilisaient MMAPv1 comme moteur de stockage par défaut.

  • Avec WiredTiger, MongoDB utilise à la fois le cache interne de WiredTiger et le cache du système de fichiers.
  • Dans MongoDB 3.2, le cache interne de WiredTiger utilise par défaut le plus grand des nombres suivants: 60% de RAM moins 1 Go, ou 1 Go.
  • Pour les systèmes dotés de 10 Go maximum de RAM, le nouveau paramètre par défaut est inférieur ou égal au paramètre 3.0 (pour MongoDB 3.0, le cache interne de WiredTiger utilise 1 Go ou la moitié de la RAM physique installée, selon la valeur la plus grande). Pour les systèmes de plus de 10 Go de RAM, le nouveau paramètre par défaut est supérieur au paramètre 3.0.

pour limiter le cache wiredTriggered Ajoutez la ligne suivante au fichier .config:

wiredTigerCacheSizeGB = 1

22
alle

Cette question a été posée à quelques reprises ... 

Voir cette question/réponse connexe (citée ci-dessous) ... comment libérer le cache utilisé par Mongodb?


MongoDB utilisera (au moins semble-t-il) beaucoup de mémoire disponible, mais laisse au VMM du système d'exploitation le soin de lui demander de libérer de la mémoire (voir Caching dans la documentation MongoDB.) 

Vous devriez pouvoir libérer n'importe quelle mémoire en redémarrant MongoDB.

Cependant, dans une certaine mesure, MongoDB n’utilise pas vraiment la mémoire. 

Par exemple, dans MongoDB docs Vérification de l'utilisation de la mémoire du serveur ...

En fonction de la plate-forme, vous pouvez voir les fichiers mappés en tant que mémoire dans le fichier processus, mais ce n'est pas strictement correct. Unix en haut peut en montrer beaucoup plus mémoire pour Mongod que ce n'est vraiment approprié. Le système d'exploitation (le gestionnaire de mémoire virtuelle .__, en particulier, selon le système d'exploitation) gère la mémoire où les "Fichiers mappés en mémoire" résider. Ce nombre est généralement indiqué dans un programme comme "free -lmt".

C'est ce qu'on appelle la mémoire "en cache".

MongoDB utilise l'algorithme de cache LRU ( Le moins récemment utilisé ) pour déterminer les "pages" à publier, vous trouverez des informations supplémentaires dans ces deux questions ...

22
Justin Jenkins

Si vous utilisez mongodb 3.2+, vous pouvez limiter le cache wiredTiger comme mentionné ci-dessus.

Dans /etc/mongod.conf, ajoutez la partie wiredTigre

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

Cela limitera la taille du cache à 1 Go, plus d'informations dans docks

Cela a résolu le problème pour moi, exécuter ubuntu 16.04 et mongoDB 3.2

21
PickleMikk

Vous pouvez limiter l’utilisation des processus Mongod à l’aide de cgroups sur Linux.

En utilisant cgroups, notre tâche peut être accomplie en quelques étapes faciles.

  1. Créer un groupe de contrôle: 

    cgcreate -g memory:DBLimitedGroup 
    

    (assurez-vous que les fichiers binaires de cgroups sont installés sur votre système, consultez le manuel de votre distribution Linux préférée pour savoir comment procéder)

  2. Spécifiez la quantité de mémoire disponible pour ce groupe:

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

    Cette commande limite la mémoire à 16G (bonne chose, cela limite la mémoire pour les allocations de malloc et le cache du système d'exploitation)

  3. Maintenant, ce sera une bonne idée de supprimer des pages déjà restées en cache:

    sync; echo 3 > /proc/sys/vm/drop_caches
    
  4. Et enfin, affectez un serveur au groupe de contrôle créé:

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

    Cela affectera un processus de mongod en cours à un groupe limité par seulement 16 Go de mémoire.

source: Utilisation de Cgroups pour limiter l'utilisation de la mémoire MySQL et MongoDB

14
rmc

Je ne pense pas que vous puissiez configurer la quantité de mémoire utilisée par MongoDB, mais ce n'est pas grave (lisez ci-dessous).

Pour citer la source officielle :

La taille de la mémoire virtuelle et la taille du résident sembleront très grandes pour le processus Mongod. C'est bénin: l'espace mémoire virtuel sera juste plus grand que la taille des fichiers de données ouverts et mappés; La taille du résident varie en fonction de la quantité de mémoire non utilisée par d'autres processus de la machine.

En d’autres termes, Mongo laissera les autres programmes utiliser la mémoire s’ils le demandent.

5
Seamus Abshere

Pour Windows, il semble possible de contrôler la quantité de mémoire utilisée par MongoDB, voir ce tutoriel sur Captain Codeman:

Limiter l'utilisation de la mémoire MongoDB sous Windows sans virtualisation

4
Kdeveloper
mongod --wiredTigerCacheSizeGB 2 xx
2
zxf曾爷

Pas vraiment, il existe quelques astuces pour limiter la mémoire, comme sur Windows, vous pouvez utiliser le Gestionnaire de ressources système Windows (WSRM) , mais généralement, Mongo fonctionne mieux sur un serveur dédié lorsqu'il est libre d'utiliser de la mémoire sans trop de conflits. avec d'autres systèmes.

Bien que le système d'exploitation essaie d'allouer de la mémoire à d'autres processus au besoin, cela peut entraîner des problèmes de performances si d'autres systèmes ont eux aussi une grande capacité de mémoire.

Si vous avez réellement besoin de limiter la mémoire et que vous n’avez qu’un seul serveur, le meilleur choix est alors la virtualisation.

2
Chris Fulstow

Cela peut être fait avec les groupes de contrôle, en combinant les connaissances de ces deux articles: https://www.percona.com/blog/2015/07/01/using-cgroups-to-limit-mysql-and- mongodb-memory-usage/
http://frank2.net/cgroups-ubuntu-14-04/

Vous pouvez trouver ici un petit script Shell qui créera des fichiers de configuration et d'init pour Ubuntu 14.04: http://brainsuckerna.blogspot.com.by/2016/05/limiting-mongodb-memory-usage-with. html

Juste comme ça:

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

Il n'y a aucune raison de limiter le cache MongoDB car, par défaut, le processus mongod utilisera la moitié de la mémoire de la machine et rien de plus. Le moteur de stockage par défaut est WiredTiger. "Avec WiredTiger, MongoDB utilise à la fois le cache interne de WiredTiger et le cache du système de fichiers."

Vous regardez probablement en haut et en supposant que Mongo utilise toute la mémoire de votre ordinateur. C'est de la mémoire virtuelle. Utilisez free -m:

              total        used        free      shared  buff/cache   available
Mem:           7982        1487        5601           8         893        6204
Swap:             0           0           0

Ce n'est que lorsque la métrique disponible atteint zéro que votre ordinateur échange la mémoire sur le disque. Dans ce cas, votre base de données est trop volumineuse pour votre ordinateur. Ajoutez une autre instance de mongodb à votre cluster.

Utilisez ces deux commandes dans la console mongod pour obtenir des informations sur la quantité de mémoire virtuelle et physique utilisée par Mongodb:

var mem = db.serverStatus().tcmalloc;

mem.tcmalloc.formattedString

------------------------------------------------
MALLOC:      360509952 (  343.8 MiB) Bytes in use by application
MALLOC: +    477704192 (  455.6 MiB) Bytes in page heap freelist
MALLOC: +     33152680 (   31.6 MiB) Bytes in central cache freelist
MALLOC: +      2684032 (    2.6 MiB) Bytes in transfer cache freelist
MALLOC: +      3508952 (    3.3 MiB) Bytes in thread cache freelists
MALLOC: +      6349056 (    6.1 MiB) Bytes in malloc metadata
MALLOC:   ------------
MALLOC: =    883908864 (  843.0 MiB) Actual memory used (physical + swap)
MALLOC: +     33611776 (   32.1 MiB) Bytes released to OS (aka unmapped)
MALLOC:   ------------
MALLOC: =    917520640 (  875.0 MiB) Virtual address space used
MALLOC:
MALLOC:          26695              Spans in use
MALLOC:             22              Thread heaps in use
MALLOC:           4096              Tcmalloc page size
0
Walker Rowe

cela a fonctionné pour moi sur une instance AWS, pour au moins effacer la mémoire en cache utilisée par mongo. Après cela, vous pourrez voir comment vos paramètres ont eu un effet.

ubuntu@hongse:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          3952       3667        284          0        617        514
-/+ buffers/cache:       2535       1416
Swap:            0          0          0
ubuntu@hongse:~$ Sudo su
root@hongse:/home/ubuntu# sync; echo 3 > /proc/sys/vm/drop_caches
root@hongse:/home/ubuntu# free -m
             total       used       free     shared    buffers     cached
Mem:          3952       2269       1682          0          1         42
-/+ buffers/cache:       2225       1726
Swap:            0          0          0
0
dcsan