Surveillance des performances de MongoDB : Commandes clés et métriques expliquées

Apprenez à surveiller de manière proactive les performances de votre MongoDB à l'aide de commandes shell essentielles. Ce guide détaille comment suivre l'état de la connexion via `db.currentOp()` et `db.serverStatus()`, analyser les requêtes lentes à l'aide des commandes de profilage (`db.setProfilingLevel`), et interpréter les métriques cruciales liées à l'utilisation des ressources et à la santé des index pour un réglage optimal de la base de données.

46 vues

Surveillance des performances MongoDB : Commandes et métriques clés expliquées

Une gestion efficace des bases de données repose sur une surveillance robuste. Pour MongoDB, une base de données de documents NoSQL de premier plan, la compréhension des métriques de performance est essentielle pour maintenir une haute disponibilité et une bonne réactivité. Les requêtes lentes, la consommation excessive de ressources ou les pics de connexion inattendus peuvent gravement affecter les performances des applications.

Ce guide explore les commandes essentielles du shell MongoDB spécifiquement conçues pour la surveillance des performances. En exécutant régulièrement ces commandes, les administrateurs et les développeurs peuvent obtenir des informations approfondies sur l'état des connexions, les temps d'exécution des requêtes, l'utilisation des ressources et la santé opérationnelle globale, ce qui permet une optimisation et un dépannage proactifs.

Commandes de surveillance essentielles dans le shell MongoDB (mongosh)

L'interface principale pour exécuter ces commandes est le shell MongoDB (mongosh), ou l'ancien shell mongo. Toutes les commandes présentées ici sont exécutées dans cet environnement de shell.

1. Comprendre les connexions actuelles : db.currentOp() et db.serverStatus()

La surveillance des connexions actives est vitale pour prévenir l'épuisement des connexions et identifier les opérations de longue durée qui pourraient bloquer des ressources.

db.currentOp()

Cette commande renvoie des informations sur les opérations en cours d'exécution sur la base de données. Elle est indispensable pour identifier les requêtes lentes ou bloquantes en temps réel.

Exemple d'utilisation :

Pour voir toutes les opérations en cours d'exécution :

db.currentOp()

Pour rechercher spécifiquement les opérations s'exécutant plus longtemps qu'un certain seuil (par exemple, les opérations s'exécutant pendant plus de 5 secondes) :

db.currentOp({"secs_running": {$gt: 5}})

La sortie inclut des détails tels que op, ns (espace de noms), query et secs_running.

db.serverStatus()

Bien que cette commande fournisse des informations d'état complètes, sa section connections est cruciale pour surveiller le pool de connexions et les limites.

Métriques clés dans serverStatus (section Connexions) :

  • current : Le nombre de connexions actives au serveur.
  • available : Le nombre de connexions disponibles pouvant être établies (basé sur le maximum configuré).
db.serverStatus().connections

2. Analyse des performances des requêtes : db.getProfilingStatus() et db.setProfilingLevel()

MongoDB fournit des outils de profilage intégrés qui enregistrent les détails d'exécution des opérations de base de données, permettant d'identifier les requêtes gourmandes en ressources.

Niveaux de profilage

Les niveaux de profilage déterminent quelles opérations sont enregistrées :

  • 0 (Désactivé) : Aucune opération n'est profilée.
  • 1 (Opérations lentes) : Seules les opérations plus lentes que le seuil configuré (slowms) sont profilées.
  • 2 (Toutes les opérations) : Toutes les opérations sont profilées, ce qui génère une charge d'écriture significative et ne doit être utilisé que brièvement pour un dépannage ciblé.

Vérification du statut

Pour voir le niveau de profilage actuel :

db.getProfilingStatus()

Définition du niveau (Exemple)

Pour activer le profilage uniquement pour les opérations lentes (opérations dépassant 100 millisecondes) :

// Définir slowms à 100 millisecondes (la valeur par défaut est généralement 100)
db.setProfilingLevel(1, { slowms: 100 })

Conseil : Ramenez toujours le profilage au niveau 0 après avoir collecté les informations nécessaires afin d'éviter la dégradation des performances causée par une journalisation excessive.

Visualisation des requêtes lentes profilées

Les opérations profilées sont stockées dans la collection system.profile au sein de la base de données spécifique surveillée. Pour afficher les 10 requêtes les plus lentes de la dernière heure :

db.system.profile.find().sort({millis: -1}).limit(10).pretty()

3. Métriques d'utilisation des ressources

Comprendre comment MongoDB utilise les ressources CPU, mémoire et E/S est essentiel pour les décisions de mise à l'échelle.

Utilisation de la mémoire et du stockage : db.serverStatus()

Les sections globalLock et storageEngine dans serverStatus fournissent des informations approfondies sur la gestion des ressources.

Indicateurs de mémoire :

  • resident : Quantité de mémoire physique utilisée par le processus.
  • virtual : Mémoire virtuelle totale allouée par le processus.
db.serverStatus().globalLock

Surveillance de la contention des verrous

MongoDB utilise des mécanismes de verrouillage internes. La surveillance de l'acquisition et de l'attente des verrous aide à identifier les goulots d'étranglement de la concurrence.

Métriques clés dans globalLock :

  • currentQueue.readers : Nombre de lecteurs en attente d'un verrou.
  • currentQueue.writers : Nombre d'écrivains en attente d'un verrou.
  • totalTime : Temps total passé à attendre des verrous sur toutes les opérations.

Des valeurs élevées dans currentQueue indiquent souvent que des index sont manquants ou que les opérations d'écriture sont excessivement longues, ce qui provoque la mise en file d'attente des lecteurs/écrivains.

4. Utilisation et santé des index : db.collection.stats()

Les index mal utilisés ou manquants sont la cause la plus fréquente de dégradation des performances. La commande stats() aide à analyser l'efficacité des index.

Lorsqu'elle est exécutée sur une collection spécifique (par exemple, users) :

db.users.stats()

Métriques clés à vérifier :

  • totalIndexSize : L'espace disque total consommé par tous les index de cette collection.
  • indexSizes : Une ventilation de l'utilisation de l'espace par index.
  • Si un index est présent mais jamais utilisé pour les lectures, il s'agit d'une surcharge qui devrait être considérée pour suppression.

5. E/S disque et débit : db.serverStatus() (Réseau et opérations)

La surveillance de l'activité réseau et du taux d'opérations donne une vue du débit de la base de données.

Taux d'opérations (à partir d'opcounters) :

opcounters suit le nombre total d'opérations exécutées depuis le dernier redémarrage du serveur, classées par type :

  • insert, query, update, delete, getmore, command.

En suivant les changements de ces compteurs au fil du temps (par exemple, en comparant deux appels serverStatus consécutifs), vous pouvez calculer le débit opérationnel (opérations par seconde).

Exemple de comparaison :

  1. Exécutez db.serverStatus().opcounters au temps T1.
  2. Exécutez db.serverStatus().opcounters au temps T2.
  3. Soustraire les valeurs de T1 des valeurs de T2 pour obtenir le total des opérations exécutées dans cet intervalle.

Bonnes pratiques pour une surveillance proactive

  • L'automatisation est essentielle : S'appuyer uniquement sur des commandes shell manuelles est inefficace. Intégrez la surveillance à l'aide d'outils comme MongoDB Cloud Manager/Ops Manager ou des solutions de surveillance tierces qui interrogent ces points d'accès automatiquement.
  • Établissez des lignes de base : Exécutez les commandes lorsque le système est sain pour établir une ligne de base de performance. Tout écart par rapport à cette ligne de base justifie une enquête immédiate.
  • Concentrez-vous sur la latence : Bien que les comptes d'opérations soient utiles, privilégiez les métriques de latence (comme le temps rapporté par les journaux de profilage) par rapport au débit brut lors du diagnostic des problèmes d'expérience utilisateur final.
  • Vérifiez fréquemment les connexions : Dans les applications à fort trafic, les limites de connexion sont souvent atteintes en premier. Surveillez db.serverStatus().connections.current par rapport au maximum configuré.

Conclusion

Maîtriser les commandes clés du shell MongoDB comme db.currentOp(), db.serverStatus() et les outils de profilage fournit aux administrateurs les moyens nécessaires pour diagnostiquer activement les goulots d'étranglement de performance. En inspectant régulièrement les pools de connexions, les plans d'exécution des requêtes (via le profilage) et la consommation des ressources, vous assurez que votre déploiement MongoDB reste rapide, efficace et fiable.