MongoDB peux limiter sa consommation mémoire suivant le moteur de données utilisée

La base Mongodb utilisé est la version 3.0.15. Elle est livrée avec deux moteurs de données:

  • MMapv1: utilisé seulement si vous avez une installation initiale de Shinken en V02.06.03 ou antérieur, toutes les installations suivantes utilisent le moteur Wired Tiger
  • Wired Tiger: moteur récent et performant, utilisé pour toutes les nouvelles installations de serveurs, présent par défaut pour les serveurs Shinken installés en V02.07.00 ou supérieur


Seul le moteur Wired Tiger possède un paramètre pour limiter sa consommation mémoire.


Si vous avez encore le moteur MMapv1, il est possible de procéder à une migration de données en suivant une des procédure de la page Migration MMapV1 vers Wired Tiger

Vous pouvez exécuter la commande suivante pour connaitre le moteur de données de MongoDB :

mongo shinken --quiet --eval "print(db.serverStatus().storageEngine.name)"

Consommation mémoire par défaut de MongoDB/ Wired Tiger

Par défaut la consommation mémoire de MongoDB utilisant le moteur Wired Tiger va monter jusqu'à 50% de la mémoire physique du serveur.

Ces données sont gardées en cache pour améliorer les performances de la base de données, et éviter de devoir faire des lectures disques qui sont nécessairement plus lentes qu'une lecture en mémoire (même avec des disques SSD). Si ces données ont été lues au moins une fois, ceci ne signifie pas qu'elles sont encore utiles, et qu'elles vont être relues dans le futur:

  • une partie du cache va être utile car souvent accédée
  • mais une autre ne sera pas utile

L'objectif de cette page est de modifier la taille du cache afin de limiter cette partie perdue, sans perdre en performance.


Limitation de la consommation mémoire du cache données de MongoDB/ Wired Tiger

Paramétrage

La modification de la limite de la taille maximum du cache se fait dans le fichier /etc/mongod.conf en rajoutant ( attention à l'indentation ):


storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 20

Ici ceci va limiter la taille maximum du cache de MongoDB à 20Go ( c'est exprimé en Gigat Octets ).

A noter que si la limite est inférieure à 1Go, il faut modifier la syntaxe:


storage:
  wiredTiger:
    engineConfig:
       configString : cache_size=256M



Pour que ce soit pris en compte, il faut redémarrer le démon mongod ( les démons utilisant la base de données doivent être éteint avant ):

/etc/init.d/mongod stop
/etc/init.d/mongod start

Il est important de noter que MongoDB sera un peu plus gros que 20Go, car ici on ne peux limiter que la taille de son cache de données, mais il a toujours besoin de ses données de travail, ses requêtes en cours, etc.

Cette consommation additionnelle est cependant raisonnable, et la consommation globale du processus mongod ne sera que légèrement plus élevé que 20Go.

Suivi des impacts de performance de la limitation de la taille du cache de données

Limiter la taille du cache de données peux avoir un impact sur les performances de la base de données. MongoDB ne possède pas d'indicateur nous permettant de tailler à l'avance au plus juste la bonne taille du cache, ou de se redimensionner dynamiquement ( comme le pourrait une base Oracle par exemple ).

Nous vous recommandons donc:

  • procéder à la diminution de la taille du cache données par étape
    • 10% par 10% de la taille de la RAM du serveur par exemple
    • suivre la variation des performances du disque qui héberge les données de MongoDB
      • si le cache est trop faible, ceci va se traduire par une augmentation des IO disques
      • si les taux d'utilisation du disque augmente, c'est que la taille optimale du cache est dépassée


Vous pouvez utiliser l'indicateur %util du check Disks Stats SSH ( voir page Disks Stats SSH )du pack de supervision Linux pour cela par exemple: