Jakýkoli typ databáze čelí problémům s výkonem, když data rostou. Jednoduché kroky, jako je přepsání problematických dotazů nebo analýza/optimalizace schématu databáze, mohou výrazně zlepšit výkon databáze. MongoDB poskytuje některé vynikající funkce, díky kterým je tento proces pro správce databází velmi snadný. Například Query Profiler, Mongostat, Mongotop, dobrá podpora protokolování atd.
O způsobu provedení dotazu rozhoduje většinou databázový systém. Uživatel pouze poskytuje podrobnosti o výsledku, který chce, prostřednictvím dotazovacího jazyka. V tomto článku budeme diskutovat o tom, jak můžeme použít profilovač dotazů MongoDB k nalezení pomalých a na zdroje náročných dotazů. MongoDB Profiler je vestavěný nástroj, který vám poskytuje aktuální přehled na úrovni dotazů. Umožňuje analyzovat všechny dotazy, které spouští databázový systém.
Povolení/konfigurace MongoDB Profiler
Obecně platí, že profiler ukládá všechna data do kolekce system.profile, na kterou lze dotazovat jako na kteroukoli jinou normální kolekci MongoDB. Profiler má 3 úrovně profilování. Ve výchozím nastavení je úroveň profilovače nastavena na 0 pro jakoukoli databázi.
Úroveň 0 | Profiler nebude protokolovat žádná data |
Úroveň 1 | Profiler zaznamená pouze pomalé operace nad určitou prahovou hodnotou |
Úroveň 2 | Profiler zaznamená všechny operace |
Chcete-li získat nějaké informace o nástroji profiler, můžete spustit následující příkazy.
-
Chcete-li získat aktuální úroveň profilování.
Výstup:db.getProfilingLevel()
0
-
Chcete-li zkontrolovat aktuální stav profilování
Výstup:db.getProfilingStatus()
{ "was" : 0, "slowms" : 100 }
-
Nastavení úrovně profilování
Výstup:db.setProfilingLevel(1, 40)
{ "was" : 0, "slowms" : 100, "ok" : 1 }
MongoDB vytiskne starou úroveň profilování a vrátí se OK, což znamená, že úroveň profilování je nyní nastavena na 1.
Slowms je prahová hodnota pro profiler, což znamená, že profiler zaznamená všechny dotazy, jejichž provedení trvá déle, než je prahová hodnota.
Porozumění výstupu Profiler
Spuštěním tohoto příkazu získáte 1 dokument z kolekce system.profile.
db.system.profile.find().limit(1).pretty()
Výstup:
{
"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" : ""
}
Toto je jeden dokument z kolekce system.profile. Vidíme, že obsahuje pro nás spoustu užitečných informací. Pojďme se podívat na některá užitečná pole z tohoto dokumentu.
- Op pole ukládá typ operace.
- Pole Ns ukládá cílovou databázi a název kolekce
- Pole Dotaz ukládá informace o dotazu a výsledku. Výsledek bude zkrácen, pokud je velikost dokumentu větší než 50 kB
- keysExamined ukládá počet indexových klíčů prozkoumaných DB pro provedení dotazu
- docsExamined ukládá celkový počet dokumentů prozkoumaných DB
- Nreturned ukládá počet dokumentů vrácených dotazem
- Millis obsahuje skutečný čas v milisekundách, který trvá provedení tohoto dotazu
- Ts ukládá časové razítko dotazu
Prozkoumáním těchto polí můžeme získat mnoho informací o tom, jak byla operace dotazu provedena databázovým systémem, a použít je k optimalizaci výkonu databáze. Pokud je například hodnota keysExamined větší než hodnota „nreturns“, ukazuje to, že DB skenuje mnoho indexů, aby získala výsledek, což nikdy není dobré znamení. Měli byste tedy správně upravit indexy databáze.
Somenines Staňte se MongoDB DBA – Uvedení MongoDB do produkce Zjistěte, co potřebujete vědět, abyste mohli nasadit, monitorovat, spravovat a škálovat MongoDBDdownload zdarmaUžitečné dotazy k analýze výstupu Profileru
-
Nejužitečnějším dotazem je seřadit všechny dokumenty podle milisek, abyste získali 10 nejpomalejších dotazů.
db.system.profile.find().sort({millis:-1}).limit(10).pretty();
-
Najděte všechny dotazy, jejichž provedení trvá déle než 30 milisekund
db.system.profile.find({millis:{$gt:30}}).pretty()
-
Najděte 10 nejpomalejších agregačních/příkazových dotazů
db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
-
Najděte všechny operace, kvůli kterým byly některé dokumenty přesunuty
db.system.profile.find({moved:true}).pretty()
-
Najít dotazy, které provádějí rozsáhlé skenování databáze
db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
-
Najděte maximální a průměrný čas každého typu operací pomocí agregace
db.system.profile.aggregate( { $group : { _id :"$op", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}).pretty()
-
Najděte maximální a průměrný čas strávený dotazy v každé databázi pomocí agregace
db.system.profile.aggregate( { $group : { _id :"$ns", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}.pretty()
Závěr
MongoDB Profiler je velmi užitečný nástroj pro získání přehledu o tom, jak databáze provádí jakékoli dotazy/příkazy. Pokud plánujete používat profiler v produkčním prostředí, měli byste provést řádné testování, protože to může ovlivnit propustnost vaší databáze, zejména když protokolujete všechny dotazy, tj. úroveň profilování je nastavena na 2. Dalším aspektem používání tohoto nástroje je definování toho, co pomalé prostředky. Musíte se rozhodnout, že všechny dotazy lze považovat za pomalé. Na základě toho můžete nastavit minimální práh pro protokolování dotazů. Tím se sníží dopad použití tohoto nástroje na výkon DB