MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Panoramica di MongoDB Database Profiler

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.

    db.getProfilingLevel()
    Uscita:
    0
  • Per verificare lo stato attuale della profilazione

    db.getProfilingStatus()
    Output:
    { "was" : 0, "slowms" : 100 }
  • Per impostare il livello di profilazione

    db.setProfilingLevel(1, 40)
    Output:
    { "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 gratuitamente

Query utili per analizzare l'output del Profiler

  1. 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();
  2. Trova tutte le query che richiedono più di 30 millisecondi per essere eseguite

    db.system.profile.find({millis:{$gt:30}}).pretty()
  3. Trova le prime 10 query di aggregazione/comando più lente

    db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
  4. Trova tutte le operazioni per le quali sono stati spostati alcuni documenti

    db.system.profile.find({moved:true}).pretty()
  5. Trova le query che eseguono scansioni di grandi dimensioni sul database

    db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
  6. 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()
  7. 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