Qualsiasi tipo di database deve affrontare problemi di prestazioni quando i dati crescono. Semplici passaggi come la riscrittura di query problematiche o l'analisi/ottimizzazione dello schema del database possono migliorare drasticamente le prestazioni del database. MongoDB fornisce alcune caratteristiche eccellenti che rendono questo processo molto semplice per i DBA. Ad esempio, Query Profiler, Mongostat, Mongotop, un buon supporto per la registrazione, ecc.
Il più delle volte, è il sistema di database che decide come verrà eseguita una query. L'utente fornisce solo i dettagli sul risultato che desidera tramite un linguaggio di query. In questo articolo, discuteremo di come utilizzare il profilatore di query MongoDB per trovare query lente e ad alta intensità di risorse. MongoDB Profiler è uno strumento integrato che fornisce informazioni dettagliate a livello di query. Ti permette di analizzare tutte le query che vengono eseguite dal sistema di database.
Abilitazione/Configurazione del Profiler MongoDB
In genere, il profiler memorizza tutti i dati nella raccolta system.profile che può essere interrogata come qualsiasi altra normale raccolta MongoDB. Profiler ha 3 livelli di profilatura. Per impostazione predefinita, il livello del profiler è impostato su 0 per qualsiasi database.
Livello 0 | Il Profiler non registrerà alcun dato |
Livello 1 | Il profiler registrerà solo le operazioni lente al di sopra di una certa soglia |
Livello 2 | Il Profiler registrerà tutte le operazioni |
Puoi eseguire i seguenti comandi per ottenere alcune informazioni sul profiler.
-
Per ottenere il livello di profilazione corrente.
Uscita:db.getProfilingLevel()
0
-
Per verificare lo stato attuale della profilazione
Output:db.getProfilingStatus()
{ "was" : 0, "slowms" : 100 }
-
Per impostare il livello di profilazione
Output:db.setProfilingLevel(1, 40)
{ "was" : 0, "slowms" : 100, "ok" : 1 }
MongoDB stamperà il vecchio livello di profilatura e restituirà OK, il che significa che il livello di profilatura è ora impostato su 1.
Slowms è un valore di soglia per il profiler, il che significa che il profiler registrerà tutte le query che richiedono più tempo del valore di soglia per essere eseguite.
Comprendere l'output del Profiler
Esegui questo comando per ottenere 1 documento dalla raccolta system.profile.
db.system.profile.find().limit(1).pretty()
Uscita:
{
"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" : ""
}
Questo è un documento dalla raccolta system.profile. Possiamo vedere che contiene molte informazioni utili per noi. Comprendiamo alcuni dei campi utili di questo documento.
- Il campo Op memorizza il tipo di operazione.
- Il campo Ns memorizza il database di destinazione e il nome della raccolta
- Il campo Query memorizza le informazioni sulla query e sul risultato. Il risultato verrà troncato se la dimensione del documento è maggiore di 50 KB
- keysExamined memorizza il numero di chiavi di indice esaminate dal DB per eseguire la query
- docsExamined memorizza il numero totale di documenti esaminati dal DB
- Nreturned memorizza il numero di documenti restituiti dalla query
- Millis contiene il tempo effettivo in millisecondi impiegato da questa query per l'esecuzione
- Ts memorizza il timestamp della query
Possiamo ottenere molte informazioni su come l'operazione di query è stata eseguita dal sistema di database esaminando questi campi e utilizzandolo per ottimizzare le prestazioni del database. Ad esempio, se il valore keysExamined è maggiore del valore "nreturns", mostra che DB sta scansionando molti indici per ottenere il risultato che non è mai un buon segno. Quindi dovresti regolare correttamente gli indici del tuo database.
Multiplenines Diventa un DBA MongoDB - Portare MongoDB in produzioneScopri cosa devi sapere per distribuire, monitorare, gestire e ridimensionare MongoDBScarica gratuitamenteQuery utili per analizzare l'output del Profiler
-
La query più utile consiste nell'ordinare tutti i documenti in millisecondi per ottenere le prime 10 query lente.
db.system.profile.find().sort({millis:-1}).limit(10).pretty();
-
Trova tutte le query che richiedono più di 30 millisecondi per essere eseguite
db.system.profile.find({millis:{$gt:30}}).pretty()
-
Trova le prime 10 query di aggregazione/comando più lente
db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
-
Trova tutte le operazioni per le quali sono stati spostati alcuni documenti
db.system.profile.find({moved:true}).pretty()
-
Trova le query che eseguono scansioni di grandi dimensioni sul database
db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
-
Trova il tempo massimo e medio impiegato da ogni tipo di operazione utilizzando l'aggregazione
db.system.profile.aggregate( { $group : { _id :"$op", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}).pretty()
-
Trova il tempo massimo e medio impiegato dalle query in ogni database utilizzando l'aggregazione
db.system.profile.aggregate( { $group : { _id :"$ns", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}.pretty()
Conclusione
MongoDB Profiler è uno strumento molto utile per ottenere informazioni dettagliate su come il database esegue qualsiasi query/comando. Se si prevede di utilizzare Profiler in un ambiente di produzione, è necessario eseguire test adeguati perché può influire sulla velocità effettiva del database, soprattutto quando si registrano tutte le query, ad esempio il livello di profilatura è impostato su 2. Un altro aspetto dell'utilizzo di questo strumento è definire cosa mezzi lenti. Devi decidere che tutte le query possono essere considerate lente. Sulla base di ciò, puoi impostare la soglia minima per registrare le query. Ciò ridurrà l'impatto dell'utilizzo di questo strumento sulle prestazioni del DB