Alla typer av databas möter prestandaproblem när data växer. Enkla steg som att skriva om problematiska frågor eller analysera/optimera databasschemat kan drastiskt förbättra databasens prestanda. MongoDB tillhandahåller några utmärkta funktioner som gör denna process mycket enkel för DBA:er. Till exempel Query Profiler, Mongostat, Mongotop, bra loggningsstöd, etc.
För det mesta är det databassystemet som bestämmer hur en fråga ska köras. Användaren ger bara information om resultatet som han/hon vill ha via ett frågespråk. I den här artikeln kommer vi att diskutera hur vi kan använda MongoDB frågeprofiler för att hitta långsamma och resurskrävande frågor. MongoDB Profiler är ett inbyggt verktyg som ger dig den faktiska insikten på frågenivån. Det låter dig analysera alla frågor som körs av databassystemet.
Aktivera/konfigurera MongoDB Profiler
Generellt lagrar profileraren all data i system.profile-samlingen som kan efterfrågas som vilken annan normal MongoDB-samling som helst. Profiler har 3 profileringsnivåer. Som standard är profileringsnivån inställd på 0 för vilken databas som helst.
Nivå 0 | Profiler loggar ingen data |
Nivå 1 | Profiler loggar endast långsamma operationer över en viss tröskel |
Nivå 2 | Profiler loggar alla operationer |
Du kan köra följande kommandon för att få lite information om profiler.
-
För att få aktuell profileringsnivå.
Utdata:db.getProfilingLevel()
0
-
För att kontrollera aktuell profilstatus
Utdata:db.getProfilingStatus()
{ "was" : 0, "slowms" : 100 }
-
För att ställa in profileringsnivå
Utdata:db.setProfilingLevel(1, 40)
{ "was" : 0, "slowms" : 100, "ok" : 1 }
MongoDB kommer att skriva ut gammal profileringsnivå och returnerar OK, vilket betyder att profileringsnivån är inställd på 1 nu.
Slowms är ett tröskelvärde för profilerare vilket innebär att profileraren loggar alla frågor som tar längre tid än tröskelvärdet att köra.
Förstå profilens utdata
Kör det här kommandot för att hämta 1 dokument från system.profile-samlingen.
db.system.profile.find().limit(1).pretty()
Utdata:
{
"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" : ""
}
Detta är ett dokument från system.profile-samlingen. Vi kan se att den innehåller massor av användbar information för oss. Låt oss förstå några av de användbara fälten i det här dokumentet.
- Op-fältet lagrar typen av operation.
- Ns-fältet lagrar måldatabas och samlingsnamn
- Frågefältet lagrar informationen om frågan och resultatet. Resultatet kommer att trunkeras om dokumentstorleken är större än 50 kB
- keysExamined lagrar antalet indexnycklar som undersökts av DB för att köra frågan
- docsExamined lagrar det totala antalet dokument som granskats av DB
- Nreturned lagrar antalet dokument som returneras av frågan
- Millis innehåller den faktiska tiden i millisekunder som den här frågan tar att köra
- Ts lagrar tidsstämpeln för frågan
Vi kan få massor av information om hur frågeoperationen utfördes av databassystemet genom att undersöka dessa fält och använda den för att optimera databasens prestanda. Till exempel, om värdet keysExamined är större än "nreturns"-värdet visar det att DB skannar många index för att få resultatet, vilket aldrig är ett gott tecken. Så du bör justera dina databasindex ordentligt.
Severalnines Become a MongoDB DBA - Bringing MongoDB to ProductionLäs om vad du behöver veta för att distribuera, övervaka, hantera och skala MongoDBDownload gratisAnvändbara frågor för att analysera profilutdata
-
Den mest användbara frågan är att sortera alla dokument efter millis för att få de 10 långsamma frågorna.
db.system.profile.find().sort({millis:-1}).limit(10).pretty();
-
Hitta alla frågor som tar mer än 30 millisekunder att köra
db.system.profile.find({millis:{$gt:30}}).pretty()
-
Hitta de 10 mest långsamma aggregerings-/kommandofrågorna
db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
-
Hitta alla operationer för vilka vissa dokument flyttades
db.system.profile.find({moved:true}).pretty()
-
Hitta frågor som utför stora skanningar i databasen
db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
-
Hitta maximal och genomsnittlig tid för varje typ av operationer med hjälp av aggregering
db.system.profile.aggregate( { $group : { _id :"$op", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}).pretty()
-
Hitta maximal och genomsnittlig tid för frågor i varje databas med hjälp av aggregering
db.system.profile.aggregate( { $group : { _id :"$ns", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}.pretty()
Slutsats
MongoDB Profiler är ett mycket användbart verktyg för att få insikter om hur databasen utför eventuella frågor/kommandon. Om du planerar att använda profiler i en produktionsmiljö, bör du göra ordentliga tester eftersom det kan påverka din databas genomströmning, särskilt när du loggar alla frågor, dvs profileringsnivån är inställd på 2. En annan aspekt av att använda det här verktyget är att definiera vad långsam betyder. Du måste bestämma att alla frågor kan betraktas som långsamma. Baserat på det kan du ställa in den lägsta tröskeln för att logga frågorna. Detta kommer att minska effekten av att använda det här verktyget på DB-prestanda