Fonctionnement du cache dans MongoDB
WiredTiger cache, working set, éviction et monitoring Atlas : notes sur le fonctionnement du cache dans MongoDB.
Ceci est une note personnelle que j’ai décidé de partager. Elle reflète ma compréhension d’un sujet et peut contenir des erreurs et des approximations. N’hésitez pas à contribuer en me contactant ici. Toute aide sera créditée !
Le système de mise en cache de MongoDB s’appuie sur deux caches : le cache interne du moteur de stockage WiredTiger et le cache du filesystem de l’OS (qui n’est pas une fonctionnalité de MongoDB).
Toutes les opérations de lecture et d’écriture dans MongoDB transitent par le cache.
Cache du filesystem de l’OS
Le cache du filesystem dépend du système d’exploitation sous-jacent. Il est entièrement géré par l’OS (et non par MongoDB ou WiredTiger). Ce cache a pour but de réduire les opérations d’I/O avec le disque en mettant en cache les pages du disque fréquemment consultées. Les données présentes dans le cache du filesystem ont le même format que celles stockées sur le disque (elles sont compressées).
Cache WiredTiger
Objectif du cache WiredTiger
Le cache WiredTiger contient les données et les index les plus récemment utilisés. On appelle « working set » la somme de tous les index et des données fréquemment consultés. Lorsque le working set tient dans le cache, les performances des requêtes sont optimales.
Ideally the cache should be configured to be large enough to hold an application’s working set.
WiredTiger documentation.
Données du cache WiredTiger
Les données chargées dans le cache WiredTiger (index et données de collection) sont représentées différemment du format sur disque :
- Les données de collection ne sont pas compressées dans le cache.
- Les index bénéficient toujours de la compression des préfixes d’index dans le cache. Les données du cache sont stockées dans des pages BTree.
On distingue deux types de données dans le cache WiredTiger :
- clean data : données identiques à la version sur disque.
- dirty data : données modifiées qui doivent être réconciliées avec la version sur disque.
Il n’y a pas d’allocation ciblée dans le cache pour les opérations de lecture ou d’écriture, ni par base de données ni par collection.
Taille du cache WiredTiger
La taille par défaut du cache WiredTiger est max(256 Mo, 0,5 * (RAM - 1 Go)).
Sur MongoDB Atlas, la taille du cache WiredTiger est :
- 50 % de la RAM sur les clusters M40 et supérieurs.
- 25 % de la RAM sur les clusters M30 et inférieurs.
Gestion du cache WiredTiger
WiredTiger surveille activement le contenu du cache et supprime des données lorsque l’espace disponible vient à manquer.
Le système de suppression se compose de :
- Un serveur d’éviction (un thread s’exécutant en arrière-plan).
- Trois files d’attente d’éviction partagées (deux classiques et une urgente).
- Zéro ou plusieurs threads de travail d’éviction (ils lisent les pages dans les files d’attente de suppression et les suppriment).
La suppression des données « clean » consiste simplement à retirer une page de la mémoire. L’éviction des données « dirty » effectue un rapprochement avec le magasin de données afin de persister la dernière version des données sur le disque.
Il est possible d’ajuster certains paramètres du système d’éviction à l’aide de divers paramètres : eviction_trigger (95 % par défaut), eviction_dirty_target (5 % par défaut), eviction_dirty_trigger (20 % par défaut)…
Le réglage de ces paramètres peut s’avérer utile dans certains cas spécifiques, tels que les écritures en masse. Si des applications tentent d’écrire un volume important de données en peu de temps, la quantité de données « dirties » augmentera très rapidement. Cela exercera une pression sur le cache et le système d’éviction. Lorsque le système ne parvient pas à réduire la taille du cache, les threads de l’application WiredTiger peuvent être mobilisés pour évincer du contenu. Cela réduira la priorité accordée à la distribution des données vers les clients.
Surveillance du cache dans MongoDB Atlas
Dans MongoDB Atlas, plusieurs indicateurs relatifs au cache sont disponibles dans le tableau de bord des indicateurs. Ils concernent uniquement le cache WiredTiger.
- Utilisation du cache (taille totale, taille des données propres, taille des données modifiées)
- Activité du cache (octets lus/écrits par seconde)
- Taux de remplissage du cache (taux de remplissage du cache, qui correspond au pourcentage de données présentes dans le cache, et taux de remplissage des données modifiées, qui correspond au pourcentage de données modifiées présentes dans le cache)