Les défauts de page sont une erreur répandue qui se produit principalement dans une grande application impliquant des données volumineuses. Cela se produit lorsque la base de données MongoDB lit les données de la mémoire physique plutôt que de la mémoire virtuelle. Les erreurs de défaut de page se produisent au moment où MongoDB veut obtenir des données qui ne sont pas disponibles dans la mémoire active de la base de données, donc obligées de lire à partir du disque. Cela crée une latence importante pour les opérations de débit, ce qui donne l'impression que les requêtes sont en retard.
L'ajustement des performances de MongoDB par réglage est un composant essentiel qui optimise l'exécution d'une application. Les bases de données sont améliorées pour fonctionner avec les informations conservées sur le disque, mais elles mettent généralement en cache de grandes quantités de données dans la RAM pour tenter d'accéder au disque. Il est coûteux de stocker et d'accéder aux données de la base de données, par conséquent, les informations doivent d'abord être stockées sur le disque avant de permettre aux applications d'y accéder. En raison du fait que les disques sont plus lents que le cache de données RAM, le processus prend donc beaucoup de temps. Par conséquent, MongoDB est conçu pour signaler l'apparition de défauts de page sous forme de résumé de tous les incidents en une seconde
La topologie de déplacement des données dans MongoDB
Les données du client sont déplacées vers la mémoire virtuelle où le cache de page les lit au fur et à mesure qu'elles sont écrites, les données sont ensuite stockées sur le disque comme indiqué dans le schéma ci-dessous.
Comment trouver les défauts de page MongoDB
Les défauts de page peuvent être détectés grâce à des performances de verrouillage qui garantissent la cohérence des données dans MongoDB. Lorsqu'une opération donnée est mise en file d'attente ou s'exécute pendant une longue période, les performances de MongoDB se dégradent et l'opération ralentit en attendant le verrouillage. Cela entraîne un ralentissement car les retards liés au verrouillage sont sporadiques et affectent parfois les performances de l'application. Le verrouillage influence les performances d'une application lorsque les verrous sont divisés (locks.timeAcquiringMicros par locks.acquireWaitCount), cela donne le temps moyen d'attente pour un mode de verrouillage donné. Locks.deadLockCount donne le total de toutes les impasses d'acquisition de verrous rencontrées. Étant donné que globalLock.totalTime est harmonieusement élevé, de nombreuses requêtes attendent un verrou. Au fur et à mesure que de plus en plus de demandes attendent le verrouillage, plus de RAM est consommée et cela conduit à des défauts de page.
Vous pouvez également utiliser mem.mapped qui permet aux développeurs d'examiner la mémoire totale utilisée par mongod. Mem.mapped est un opérateur de serveur permettant de vérifier la quantité de mémoire en mégaoctets (Mo) dans un moteur de stockage MMAPv1. Si l'opérateur mem.mapped affiche une valeur supérieure à la quantité totale de mémoire système, une erreur de page se produira, car une utilisation aussi importante de la mémoire entraînera une erreur de page dans la base de données.
Comment les défauts de page se produisent dans MongoDB
Le chargement des pages dans MongoDB dépend de la disponibilité de la mémoire libre, dans le cas où il manque de mémoire libre, le système d'exploitation doit :
- Recherchez une page que la base de données a cessé d'utiliser et écrivez la page sur le disque mémoire.
- Charger la page demandée en mémoire après l'avoir lue depuis le disque.
Ces deux activités ont lieu lors du chargement des pages et consomment donc beaucoup de temps par rapport à la lecture dans une mémoire active, entraînant l'apparition de défauts de page.
Résoudre les erreurs de page MongoDB
Voici quelques façons de résoudre les défauts de page :
- Mise à l'échelle verticale vers les appareils disposant de suffisamment de RAM ou mise à l'échelle horizontale : lorsque la RAM est insuffisante pour un ensemble de données donné, la bonne approche consiste à augmenter la mémoire RAM en effectuant une mise à l'échelle verticale vers les appareils disposant de plus de RAM afin d'ajouter plus de ressources au serveur. La mise à l'échelle verticale est l'un des moyens les meilleurs et les plus simples d'améliorer les performances de MongoDB en ne répartissant pas la charge sur plusieurs serveurs. Dans la mesure où la mise à l'échelle verticale ajoute plus de RAM, la mise à l'échelle horizontale permet d'ajouter plus de fragments à un cluster fragmenté. En termes simples, la mise à l'échelle horizontale est l'endroit où la base de données est divisée en plusieurs morceaux et stockée sur plusieurs serveurs. La mise à l'échelle horizontale permet au développeur d'ajouter plus de serveurs à la volée, ce qui améliore considérablement les performances de la base de données car elle n'entraîne donc pas de temps d'arrêt nul. La mise à l'échelle verticale et la mise à l'échelle horizontale réduisent l'occurrence de résolution de défaut de page en augmentant la mémoire que l'on utilise tout en travaillant avec la base de données.
- Indexez correctement les données : utilisez des index appropriés afin de vous assurer qu'il existe des requêtes efficaces qui ne provoquent pas d'analyses de la collection. Une indexation correcte garantit que la base de données n'itère pas sur chaque document d'une collection et résout ainsi l'occurrence possible d'une erreur de page. L'analyse de la collection provoque une erreur de défaut de page car toute la collection est inspectée par le moteur de requête lors de sa lecture dans la RAM. La plupart des documents de l'analyse de la collection ne sont pas renvoyés dans l'application et provoquent ainsi des défauts de page inutiles pour chaque requête ultérieure qui n'est pas facile à éluder. De plus, des index excessifs peuvent également entraîner une utilisation inefficace de la RAM, ce qui peut entraîner une erreur de page. Par conséquent, une indexation appropriée est primordiale si un développeur a l'intention de résoudre les erreurs de page. MongoDB offre une assistance pour déterminer les index à déployer lors de l'utilisation de la base de données. Ils offrent à la fois un analyseur de requête lente qui donne les informations nécessaires sur la façon d'indexer pour les utilisateurs et les utilisateurs partagés.
- Migration vers la dernière version de MongoDB, puis déplacement de l'application vers WiredTiger. Cela est nécessaire si vous avez l'intention d'éviter les erreurs de page, car les erreurs de page ne sont courantes que dans les moteurs de stockage MMAPv1, contrairement aux versions plus récentes et à WiredTiger. Le moteur de stockage MMAPv1 est obsolète et MongoDB ne le prend plus en charge. WiredTiger est le moteur de stockage par défaut actuel dans MongoDB et il dispose d'un contrôle de concurrence multiversion qui le rend bien meilleur par rapport au moteur de stockage MMAPv1. Avec WiredTiger, MongoDB peut utiliser à la fois le cache du système de fichiers et le cache interne WiredTiger qui a une très grande taille de 1 Go (50% 0f (RAM - 1 Go)) ou 256 Mo.
- Gardez une trace de la quantité totale de RAM disponible pour votre système. Cela peut être fait en utilisant des services comme New Relic qui surveille Google Cloud Monitoring. De plus, BindPlane peut être utilisé avec les services de surveillance cloud mentionnés. L'utilisation d'un système de surveillance est une mesure proactive qui permet de contrer les défauts de page avant qu'ils ne surviennent plutôt que de réagir aux défauts de page qui se produisent. BindPlane permet au moniteur de configurer des alertes constantes pour l'apparition de défauts de page, les alertes permettent également de connaître le nombre d'index, la taille de l'index et la taille du fichier.
- Assurez-vous que les données sont configurées dans l'ensemble de travail en vigueur et n'utiliseront pas plus de RAM que ce qui est recommandé. MongoDB est un système de base de données qui fonctionne mieux lorsque les données et les index fréquemment consultés peuvent parfaitement s'intégrer dans la mémoire attribuée. La taille de la RAM est un aspect essentiel lors de l'optimisation des performances de la base de données. Il faut donc s'assurer qu'il y a toujours suffisamment de mémoire RAM avant de déployer l'application.
- Distribuer la charge entre les instances mongod en ajoutant des fragments ou en déployant un cluster fragmenté. Il est d'une importance vitale de permettre l'ombrage là où se trouve la collection ciblée. Commencez par vous connecter à mongos dans le shell mongo et utilisez la méthode ci-dessous.
-
sh.shardCollection()
Créez ensuite un index par cette méthode.
L'index créé prend en charge la clé de partition, c'est-à-dire si la collection créée avait déjà reçu ou stocké des données. Cependant, si la collection ne contient aucune donnée (vide), utilisez la méthode ci-dessous pour l'indexer dans le cadre de ssh.shardCollection : sh.shardCollection()db.collection.createIndex(keys, options)
- Elle est suivie par l'une des deux stratégies fournies par mongoDB.
- Ombrage haché
sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )
- Ombrage basé sur la plage
sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )
- Ombrage haché
-
Comment éviter les erreurs de page MongoDB
- Ajouter des partitions ou déployer un cluster partitionné pour répartir la charge
- Avoir suffisamment de RAM pour votre application avant de la déployer
- Passez aux nouvelles versions de MongoDB puis passez à WiredTiger
- Mettre à l'échelle verticalement ou horizontalement pour un appareil avec plus de RAM
- Utilisez la RAM recommandée et gardez une trace de l'espace RAM utilisé
Conclusion
Un petit nombre de défauts de page (Seul) prend peu de temps cependant, dans une situation où il y a de nombreux défauts de page (agrégat), c'est une indication que la base de données lit un grand nombre de données dans le disque. Lorsque l'agrégation se produit, il y aura plus de verrous de lecture MongoBD qui conduiront à une erreur de page.
Lors de l'utilisation de MongoDB, la taille de la RAM du système et le nombre de requêtes peuvent grandement influencer les performances de l'application. Les performances d'une application dans MongoDB dépendent fortement de la RAM disponible sur la mémoire physique, ce qui a un impact sur le temps nécessaire à l'application pour effectuer une seule requête. Avec suffisamment de RAM , les défauts de page sont réduits et les performances de l'application sont améliorées.