Enhver type database står over for ydeevneproblemer, når data vokser. Simple trin som omskrivning af problematiske forespørgsler eller analyse/optimering af databaseskemaet kan forbedre databasens ydeevne drastisk. MongoDB giver nogle fremragende funktioner, som gør denne proces meget nem for DBA'er. For eksempel, Query Profiler, Mongostat, Mongotop, god logningsunderstøttelse osv.
Det meste af tiden er det databasesystemet, der bestemmer, hvordan en forespørgsel skal udføres. Brugeren giver blot de detaljer om resultatet, som han/hun ønsker via et forespørgselssprog. I denne artikel vil vi diskutere, hvordan vi kan bruge MongoDB-forespørgselsprofiler til at finde langsomme og ressourcekrævende forespørgsler. MongoDB Profiler er et indbygget værktøj, som giver dig den faktiske forespørgselsniveau indsigt. Det giver dig mulighed for at analysere alle de forespørgsler, der køres af databasesystemet.
Aktivering/konfiguration af MongoDB Profiler
Generelt gemmer profileren alle data i system.profile-samlingen, som kan forespørges som enhver anden normal MongoDB-samling. Profiler har 3 profileringsniveauer. Som standard er profileringsniveauet sat til 0 for enhver database.
Niveau 0 | Profiler vil ikke logge nogen data |
Niveau 1 | Profiler vil kun logge langsomme operationer over en tærskel |
Niveau 2 | Profiler vil logge alle handlinger |
Du kan køre følgende kommandoer for at få nogle oplysninger om profiler.
-
For at få det aktuelle profileringsniveau.
Output:db.getProfilingLevel()
0
-
For at kontrollere den aktuelle profileringsstatus
Output:db.getProfilingStatus()
{ "was" : 0, "slowms" : 100 }
-
For at indstille profileringsniveau
Output:db.setProfilingLevel(1, 40)
{ "was" : 0, "slowms" : 100, "ok" : 1 }
MongoDB udskriver det gamle profileringsniveau og returnerer OK, hvilket betyder, at profileringsniveauet er sat til 1 nu.
Slowms er en tærskelværdi for profiler, hvilket betyder, at profiler vil logge alle de forespørgsler, der tager længere tid end tærskelværdien at udføre.
Forstå Profiler-outputtet
Kør denne kommando for at hente 1 dokument fra system.profile-samlingen.
db.system.profile.find().limit(1).pretty()
Output:
{
"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" : ""
}
Dette er et dokument fra system.profile-samlingen. Vi kan se, at den indeholder en masse nyttig information for os. Lad os forstå nogle af de nyttige felter fra dette dokument.
- Op-feltet gemmer operationstypen.
- Ns-feltet gemmer måldatabase og samlingsnavn
- Forespørgselsfeltet gemmer oplysningerne om forespørgslen og resultatet. Resultatet afkortes, hvis dokumentstørrelsen er større end 50 KB
- keysExamined gemmer antallet af indeksnøgler, der er undersøgt af DB for at udføre forespørgslen
- docsExamined gemmer det samlede antal dokumenter, der er undersøgt af DB
- Nreturned gemmer antallet af dokumenter, der returneres af forespørgslen
- Millis indeholder den faktiske tid i millisekunder, det tager at udføre denne forespørgsel
- Ts gemmer tidsstemplet for forespørgslen
Vi kan få masser af information om, hvordan forespørgselsoperationen blev udført af databasesystemet ved at undersøge disse felter og bruge dem til at optimere databasens ydeevne. For eksempel, hvis keysExamined-værdien er større end "nreturns"-værdien, viser det, at DB scanner mange indekser for at få resultatet, hvilket aldrig er et godt tegn. Så du bør justere dine databaseindekser korrekt.
Severalnines Bliv en MongoDB DBA - Bring MongoDB to ProductionFå flere oplysninger om, hvad du skal vide for at implementere, overvåge, administrere og skalere MongoDBDownload gratisNyttige forespørgsler til at analysere Profiler-output
-
Den mest nyttige forespørgsel er at sortere alle dokumenterne efter millis for at få de 10 bedste langsomme forespørgsler.
db.system.profile.find().sort({millis:-1}).limit(10).pretty();
-
Find alle forespørgsler, der tager mere end 30 millisekunder at udføre
db.system.profile.find({millis:{$gt:30}}).pretty()
-
Find de 10 langsomste aggregerings-/kommandoforespørgsler
db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
-
Find alle de operationer, som nogle dokumenter blev flyttet til
db.system.profile.find({moved:true}).pretty()
-
Find forespørgsler, der udfører store scanninger på databasen
db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
-
Find maksimal og gennemsnitlig tid for hver type operationer ved hjælp af aggregering
db.system.profile.aggregate( { $group : { _id :"$op", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}).pretty()
-
Find maksimal og gennemsnitlig tid for forespørgsler i hver database ved hjælp af aggregering
db.system.profile.aggregate( { $group : { _id :"$ns", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}.pretty()
Konklusion
MongoDB Profiler er et meget nyttigt værktøj til at få indsigt i, hvordan databasen udfører forespørgsler/kommandoer. Hvis du planlægger at bruge profiler i et produktionsmiljø, bør du udføre ordentlige tests, fordi det kan påvirke din databasegennemstrømning, især når du logger alle forespørgslerne, dvs. profileringsniveauet er sat til 2. Et andet aspekt ved at bruge dette værktøj er at definere, hvad langsom betyder. Du skal beslutte, at alle forespørgsler kan betragtes som langsomme. Baseret på det kan du indstille minimumstærsklen for at logge forespørgslerne. Dette vil reducere virkningen af at bruge dette værktøj på DB-ydeevne