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?.
À 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.
pour limiter le cache wiredTriggered Ajoutez la ligne suivante au fichier .config:
wiredTigerCacheSizeGB = 1
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 ...
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
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.
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)
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)
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
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
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.
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
mongod --wiredTigerCacheSizeGB 2 xx
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.
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'
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
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