MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Überblick über den MongoDB-Datenbank-Profiler

Bei jeder Art von Datenbank treten Leistungsprobleme auf, wenn die Datenmenge wächst. Einfache Schritte wie das Umschreiben problematischer Abfragen oder das Analysieren/Optimieren des Datenbankschemas können die Leistung der Datenbank drastisch verbessern. MongoDB bietet einige hervorragende Funktionen, die diesen Prozess für DBAs sehr einfach machen. Beispielsweise Query Profiler, Mongostat, Mongotop, gute Protokollierungsunterstützung usw.

Meistens entscheidet das Datenbanksystem, wie eine Abfrage ausgeführt wird. Der Benutzer gibt lediglich die Details über das gewünschte Ergebnis über eine Abfragesprache an. In diesem Artikel werden wir erörtern, wie wir den MongoDB-Abfrage-Profiler verwenden können, um langsame und ressourcenintensive Abfragen zu finden. MongoDB Profiler ist ein integriertes Tool, das Ihnen die tatsächlichen Einblicke auf Abfrageebene gibt. Es ermöglicht Ihnen, alle Abfragen zu analysieren, die vom Datenbanksystem ausgeführt werden.

Aktivieren/Konfigurieren des MongoDB-Profilers

Im Allgemeinen speichert der Profiler alle Daten in der system.profile-Sammlung, die wie jede andere normale MongoDB-Sammlung abgefragt werden kann. Profiler hat 3 Profilierungsebenen. Standardmäßig ist die Profilerebene für alle Datenbanken auf 0 gesetzt.

Stufe 0 Profiler protokolliert keine Daten
Stufe 1 Profiler protokolliert nur langsame Vorgänge über einem bestimmten Schwellenwert
Stufe 2 Profiler protokolliert alle Vorgänge

Sie können die folgenden Befehle ausführen, um einige Informationen über den Profiler zu erhalten.

  • Um das aktuelle Profiling-Level abzurufen.

    db.getProfilingLevel()
    Ausgabe:
    0
  • So prüfen Sie den aktuellen Profilstatus

    db.getProfilingStatus()
    Ausgabe:
    { "was" : 0, "slowms" : 100 }
  • So legen Sie die Profilebene fest

    db.setProfilingLevel(1, 40)
    Ausgabe:
    { "was" : 0, "slowms" : 100, "ok" : 1 }

    MongoDB druckt das alte Profiling-Level und gibt OK zurück, was bedeutet, dass das Profiling-Level jetzt auf 1 gesetzt ist.

    Slowms ist ein Schwellenwert für den Profiler, was bedeutet, dass der Profiler alle Abfragen protokolliert, deren Ausführung länger dauert als der Schwellenwert.

Die Profiler-Ausgabe verstehen

Führen Sie diesen Befehl aus, um 1 Dokument aus der system.profile-Sammlung abzurufen.

db.system.profile.find().limit(1).pretty()

Ausgabe:

{
    "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" : ""
}

Dies ist ein Dokument aus der system.profile-Sammlung. Wir können sehen, dass es viele nützliche Informationen für uns enthält. Lassen Sie uns einige der nützlichen Felder aus diesem Dokument verstehen.

  • Op-Feld speichert die Art der Operation.
  • Ns-Feld speichert Zieldatenbank und Sammlungsname
  • Das Abfragefeld speichert die Informationen über die Abfrage und das Ergebnis. Das Ergebnis wird abgeschnitten, wenn das Dokument größer als 50 KB ist
  • keysExamined speichert die Anzahl der Indexschlüssel, die von DB untersucht wurden, um die Abfrage auszuführen
  • docsExamined speichert die Gesamtzahl der von der DB untersuchten Dokumente
  • Nreturned speichert die Anzahl der von der Abfrage zurückgegebenen Dokumente
  • Millis enthält die tatsächliche Zeit in Millisekunden, die von dieser Abfrage zur Ausführung benötigt wird
  • Ts speichert den Zeitstempel der Anfrage

Wir können viele Informationen darüber erhalten, wie die Abfrageoperation vom Datenbanksystem ausgeführt wurde, indem wir diese Felder untersuchen und sie verwenden, um die Leistung der Datenbank zu optimieren. Wenn beispielsweise der Wert von keysExamined größer als der Wert von „nreturns“ ist, zeigt dies, dass DB viele Indizes scannt, um das Ergebnis zu erhalten, was niemals ein gutes Zeichen ist. Sie sollten also Ihre Datenbankindizes richtig anpassen.

Multiplenines Become a MongoDB DBA – Bringing MongoDB to ProductionErfahren Sie, was Sie wissen müssen, um MongoDBDownload for Free bereitzustellen, zu überwachen, zu verwalten und zu skalieren

Nützliche Abfragen zur Analyse der Profilerausgabe

  1. Die nützlichste Abfrage besteht darin, alle Dokumente nach Millisekunden zu sortieren, um die 10 langsamsten Abfragen zu erhalten.

    db.system.profile.find().sort({millis:-1}).limit(10).pretty();
  2. Alle Abfragen finden, deren Ausführung länger als 30 Millisekunden dauert

    db.system.profile.find({millis:{$gt:30}}).pretty()
  3. Finden Sie die 10 langsamsten Aggregations-/Befehlsabfragen

    db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
  4. Finden Sie alle Vorgänge, für die einige Dokumente verschoben wurden

    db.system.profile.find({moved:true}).pretty()
  5. Abfragen finden, die große Scans in der Datenbank durchführen

    db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
  6. Ermitteln Sie mithilfe der Aggregation die maximale und durchschnittliche Zeit, die von jeder Art von Vorgang benötigt wird

    db.system.profile.aggregate(
    { $group : { 
       _id :"$op", 
       count:{$sum:1},
       "max_time":{$max:"$millis"},
       "avg_time":{$avg:"$millis"}
    }}).pretty()
  7. Ermitteln Sie mithilfe der Aggregation die maximale und durchschnittliche Zeit, die von Abfragen in jeder Datenbank benötigt wird

    db.system.profile.aggregate(
    { $group : {
      _id :"$ns",
      count:{$sum:1}, 
      "max_time":{$max:"$millis"}, 
      "avg_time":{$avg:"$millis"}  
    }}.pretty()

Schlussfolgerung

MongoDB Profiler ist ein sehr nützliches Tool, um Einblicke zu erhalten, wie die Datenbank Abfragen/Befehle ausführt. Wenn Sie vorhaben, den Profiler in einer Produktionsumgebung zu verwenden, sollten Sie ordnungsgemäße Tests durchführen, da dies Auswirkungen auf Ihren Datenbankdurchsatz haben kann, insbesondere wenn Sie alle Abfragen protokollieren, d langsam bedeutet. Sie müssen entscheiden, dass alle Abfragen als langsam angesehen werden können. Auf dieser Grundlage können Sie den Mindestschwellenwert für die Protokollierung der Abfragen festlegen. Dadurch werden die Auswirkungen der Verwendung dieses Tools auf die DB-Leistung verringert