MongoDB Database Profiler
Introduction :
Le Database Profiler de MongoDB est un outil puissant pour diagnostiquer et résoudre les problèmes de performance. Il permet d’analyser les opérations lentes, de comprendre les goulots d’étranglement et d’optimiser les requêtes inefficaces.
Dans cet article, nous explorerons en détail comment activer et utiliser cet outil, les types d’informations qu’il collecte, et comment exploiter ses résultats avec des exemples concrets.
1. Qu’est-ce que le Database Profiler ?
Le Database Profiler collecte des informations sur les opérations exécutées dans une base MongoDB et les enregistre dans une collection spéciale appelée `system.profile`. Ces informations incluent :
- Type d’opération : Requête, insertion, mise à jour, suppression, …
- Temps d’exécution : Durée en millisecondes de chaque opération.
- Plan d’exécution : Indique si un index a été utilisé ou si un scan complet de collection a été effectué.
- Documents et clés analysés : Évalue l’efficacité des index.
Le profiler peut être configuré pour enregistrer toutes les opérations, uniquement les opérations lentes, ou rester désactivé par défaut pour préserver les performances.
2. Les niveaux de profilage
MongoDB propose trois niveaux de profilage :
Niveau 0 : Désactivé
Le profilage est désactivé. Aucune opération n’est enregistrée. :
Commande :
db.setProfilingLevel(0);
Niveau 1 : Opérations lentes uniquement
Enregistre uniquement les opérations dépassant un seuil de temps, défini par le paramètre `slowms` :
Commande :
db.setProfilingLevel(1, { slowms: 100 });
Niveau 2 : Toutes les opérations
Enregistre toutes les opérations, quel que soit leur temps d’exécution :
commande :
db.setProfilingLevel(2);
3. Informations collectées
Les enregistrements générés par le profiler contiennent des champs utiles pour diagnostiquer les problèmes. Voici quelques champs clés :
- op : Type d’opération (e.g., `query`, `update`, `insert`).
- ns : Namespace (base de données et collection concernées).
- query : Critères de recherche utilisés.
- millis : Temps d’exécution en millisecondes.
- keysExamined et docsExamined : Nombre de clés/index et de documents analysés.
- planSummary : Résumé du plan d’exécution (`COLLSCAN`, `IXSCAN`, etc.).
Exemple de document enregistré dans system.profile
:
{
« op »: « query »,
« ns »: « ecommerce.orders »,
« query »: { « status »: « completed » },
« millis »: 250,
« keysExamined »: 1000,
« docsExamined »: 1000,
« planSummary »: « IXSCAN »,
« numYield »: 2
}
4. Étapes pour utiliser le Database Profiler
Étape 1 : Activer le profiler
Pour activer le profiler au niveau 1 et enregistrer les opérations dépassant un seuil de 50 ms :
db.setProfilingLevel(1, { slowms: 50 });
Étape 2 : Exécuter une requête et l’analyser
Supposons que nous avons une collection orders
avec 1 million de documents, et que nous exécutons la requête suivante
db.orders.find({ status: « completed » });
Étape 3 : Vérifier les enregistrements dans system.profile
Pour examiner les données enregistrées par le profiler :
db.system.profile.find().sort({ ts: -1 }).limit(5);
{
« op »: « query »,
« ns »: « ecommerce.orders »,
« query »: { « status »: « completed » },
« millis »: 300,
« keysExamined »: 0,
« docsExamined »: 1000000,
« planSummary »: « COLLSCAN »,
« numYield »: 1
}
Analyse :
- planSummary indique
COLLSCAN
, ce qui signifie qu’un scan complet de collection a été effectué. - docsExamined est élevé (1 million), car aucun index n’est utilisé.
Résolution :
Créer un index sur le champ status
pour optimiser la requête :
db.orders.createIndex({ status: 1 });
db.orders.find({ status: « completed » });
system.profile
:
{
« op »: « query »,
« ns »: « ecommerce.orders »,
« query »: { « status »: « completed » },
« millis »: 25,
« keysExamined »: 500,
« docsExamined »: 0,
« planSummary »: « IXSCAN »,
« numYield »: 0
}
Analyse :
- millis est passé de 300 ms à 25 ms.
- keysExamined indique que l’index est maintenant utilisé.
Étape 5 : Rechercher des problèmes spécifiques :
Pour identifier les opérations les plus lentes, exécutez la commande suivante :
db.system.profile.find({ millis: { $gt: 100 } }).sort({ millis: -1 }).limit(10);
Étape 6 : Analyser une requête avec explain()
Utilisez la méthode `explain()` pour comprendre comment une requête est exécutée. Par exemple :
db.orders.find({ status: « completed » }).explain(« executionStats »);
Cela fournit des détails comme le nombre de documents scannés, les index utilisés, et le temps d’exécution.
Étape 7 : Désactiver le profiler
Une fois le diagnostic terminé, désactivez le profiler pour éviter un impact sur les performances :
db.setProfilingLevel(0);
5. Bonnes pratiques
- Limiter l’utilisation en production : Utilisez le niveau 1 avec un seuil raisonnable.
- Analyser régulièrement les performances : Planifiez des analyses périodiques pour anticiper les problèmes.
- Nettoyer la collection
system.profile
: Si elle devient volumineuse, utilisez la commande suivante :
db.system.profile.drop();
Conclusion
MongoDB est un outil précieux pour surveiller et optimiser les performances. En suivant les étapes et exemples décrits, vous pouvez identifier rapidement les opérations lentes, appliquer les correctifs nécessaires, et garantir une base de données performante et fiable.
Bravo pour l’article.