Tout type de base de données est confronté à des problèmes de performances lorsque les données augmentent. Des étapes simples comme la réécriture des requêtes problématiques ou l'analyse/l'optimisation du schéma de la base de données peuvent considérablement améliorer les performances de la base de données. MongoDB fournit d'excellentes fonctionnalités qui rendent ce processus très facile pour les DBA. Par exemple, Query Profiler, Mongostat, Mongotop, un bon support de journalisation, etc.
La plupart du temps, c'est le système de base de données qui décide de l'exécution d'une requête. L'utilisateur fournit simplement les détails sur le résultat qu'il souhaite via un langage de requête. Dans cet article, nous verrons comment nous pouvons utiliser le profileur de requêtes MongoDB pour trouver des requêtes lentes et gourmandes en ressources. MongoDB Profiler est un outil intégré qui vous donne les informations réelles au niveau de la requête. Il vous permet d'analyser toutes les requêtes exécutées par le système de base de données.
Activation/Configuration du profileur MongoDB
Généralement, le profileur stocke toutes les données dans la collection system.profile qui peut être interrogée comme n'importe quelle autre collection MongoDB normale. Profiler a 3 niveaux de profilage. Par défaut, le niveau du profileur est défini sur 0 pour toutes les bases de données.
Niveau 0 | Profiler n'enregistrera aucune donnée |
Niveau 1 | Profiler enregistrera uniquement les opérations lentes au-dessus d'un certain seuil |
Niveau 2 | Profiler enregistrera toutes les opérations |
Vous pouvez exécuter les commandes suivantes pour obtenir des informations sur le profileur.
-
Pour obtenir le niveau de profilage actuel.
Sortie :db.getProfilingLevel()
0
-
Pour vérifier l'état actuel du profilage
Sortie :db.getProfilingStatus()
{ "was" : 0, "slowms" : 100 }
-
Pour définir le niveau de profilage
Sortie :db.setProfilingLevel(1, 40)
{ "was" : 0, "slowms" : 100, "ok" : 1 }
MongoDB imprimera l'ancien niveau de profilage et retournera OK, ce qui signifie que le niveau de profilage est défini sur 1 maintenant.
Slowms est une valeur seuil pour le profileur, ce qui signifie que le profileur enregistrera toutes les requêtes dont l'exécution prend plus de temps que la valeur seuil.
Comprendre la sortie du profileur
Exécutez cette commande pour obtenir 1 document de la collection system.profile.
db.system.profile.find().limit(1).pretty()
Sortie :
{
"op" : "query",
"ns" : "mydb.Log",
"query" : {
"find" : "Log",
"filter" : {
"EMP_ID" : "01778"
}
},
"keysExamined" : 0,
"docsExamined" : 90022,
"cursorExhausted" : true,
"keyUpdates" : 0,
"writeConflicts" : 0,
"numYield" : 703,
"locks" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(1408)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(704)
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(704)
}
}
},
"nreturned" : 60,
"responseLength" : 17676,
"protocol" : "op_command",
"millis" : 40,
"execStats" : {
"stage" : "COLLSCAN",
"filter" : {
"EMP_ID" : {
"$eq" : "01778"
}
},
"nReturned" : 60,
"executionTimeMillisEstimate" : 30,
"works" : 90024,
"advanced" : 60,
"needTime" : 89963,
"needYield" : 0,
"saveState" : 703,
"restoreState" : 703,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 90022
},
"ts" : ISODate("2018-09-09T07:24:56.487Z"),
"client" : "127.0.0.1",
"allUsers" : [ ],
"user" : ""
}
Ceci est un document de la collection system.profile. Nous pouvons voir qu'il contient beaucoup d'informations utiles pour nous. Comprenons quelques-uns des champs utiles de ce document.
- Le champ Op stocke le type d'opération.
- Le champ Ns stocke la base de données cible et le nom de la collection
- Le champ de requête stocke les informations sur la requête et le résultat. Le résultat sera tronqué si la taille du document est supérieure à 50 Ko
- keysExamined stocke le nombre de clés d'index examinées par DB pour exécuter la requête
- docsExamined stocke le nombre total de documents examinés par la base de données
- Nreturned stocke le nombre de documents renvoyés par la requête
- Millis contient le temps réel en millisecondes pris par cette requête pour s'exécuter
- Ts stocke l'horodatage de la requête
Nous pouvons obtenir de nombreuses informations sur la manière dont l'opération de requête a été effectuée par le système de base de données en examinant ces champs et en les utilisant pour optimiser les performances de la base de données. Par exemple, si la valeur keysExamined est supérieure à la valeur "nreturns", cela indique que la base de données analyse de nombreux index pour obtenir le résultat, ce qui n'est jamais bon signe. Vous devez donc ajuster correctement les index de votre base de données.
Plusieursnines Devenez un administrateur de base de données MongoDB – Amener MongoDB en productionDécouvrez ce que vous devez savoir pour déployer, surveiller, gérer et faire évoluer MongoDBDélécharger gratuitementRequêtes utiles pour analyser la sortie du profileur
-
La requête la plus utile consiste à trier tous les documents par millis pour obtenir les 10 requêtes les plus lentes.
db.system.profile.find().sort({millis:-1}).limit(10).pretty();
-
Trouver toutes les requêtes dont l'exécution prend plus de 30 millisecondes
db.system.profile.find({millis:{$gt:30}}).pretty()
-
Trouvez les 10 requêtes d'agrégation/commande les plus lentes
db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
-
Retrouver toutes les opérations pour lesquelles certains documents ont été déplacés
db.system.profile.find({moved:true}).pretty()
-
Rechercher les requêtes qui effectuent de grandes analyses sur la base de données
db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
-
Trouvez le temps maximum et moyen pris par chaque type d'opérations en utilisant l'agrégation
db.system.profile.aggregate( { $group : { _id :"$op", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}).pretty()
-
Trouvez le temps maximum et moyen pris par les requêtes dans chaque base de données en utilisant l'agrégation
db.system.profile.aggregate( { $group : { _id :"$ns", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}.pretty()
Conclusion
MongoDB Profiler est un outil très utile pour avoir un aperçu de la façon dont la base de données exécute les requêtes/commandes. Si vous envisagez d'utiliser le profileur dans un environnement de production, vous devez effectuer des tests appropriés, car cela peut avoir un impact sur le débit de votre base de données, en particulier lorsque vous enregistrez toutes les requêtes, c'est-à-dire que le niveau de profilage est défini sur 2. Un autre aspect de l'utilisation de cet outil consiste à définir ce que moyens lents. Vous devez décider que toutes les requêtes peuvent être considérées comme lentes. Sur cette base, vous pouvez définir le seuil minimum pour enregistrer les requêtes. Cela réduira l'impact de l'utilisation de cet outil sur les performances de la base de données