sql >> Database >  >> NoSQL >> MongoDB

Overzicht van de MongoDB Database Profiler

Elk type database heeft te maken met prestatieproblemen wanneer gegevens groeien. Eenvoudige stappen, zoals het herschrijven van problematische query's of het analyseren/optimaliseren van het databaseschema, kunnen de prestaties van de database drastisch verbeteren. MongoDB biedt een aantal uitstekende functies die dit proces zeer eenvoudig maken voor DBA's. Bijvoorbeeld Query Profiler, Mongostat, Mongotop, goede ondersteuning voor loggen, enz.

Meestal is het het databasesysteem dat bepaalt hoe een query wordt uitgevoerd. De gebruiker geeft alleen de details over het gewenste resultaat via een zoektaal. In dit artikel zullen we bespreken hoe we MongoDB-queryprofiler kunnen gebruiken om langzame en resource-intensieve zoekopdrachten te vinden. MongoDB Profiler is een ingebouwde tool die u de feitelijke inzichten op queryniveau geeft. Hiermee kunt u alle zoekopdrachten analyseren die door het databasesysteem worden uitgevoerd.

De MongoDB Profiler inschakelen/configureren

Over het algemeen slaat de profiler alle gegevens op in de system.profile-verzameling die kan worden opgevraagd zoals elke andere normale MongoDB-verzameling. Profiler heeft 3 profileringsniveaus. Standaard is het profiler-niveau ingesteld op 0 voor elke database.

Niveau 0 Profiler registreert geen gegevens
Niveau 1 Profiler registreert alleen langzame bewerkingen boven een bepaalde drempel
Niveau 2 Profiler zal alle bewerkingen loggen

U kunt de volgende opdrachten uitvoeren om wat informatie over profiler te krijgen.

  • Om het huidige profileringsniveau te krijgen.

    db.getProfilingLevel()
    Uitvoer:
    0
  • De huidige profileringsstatus controleren

    db.getProfilingStatus()
    Uitvoer:
    { "was" : 0, "slowms" : 100 }
  • Profileringsniveau instellen

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

    MongoDB drukt het oude profileringsniveau af en retourneert OK, wat betekent dat het profileringsniveau nu op 1 is ingesteld.

    Slowms is een drempelwaarde voor profiler, wat betekent dat de profiler alle zoekopdrachten registreert die meer tijd vergen dan de drempelwaarde om uit te voeren.

De Profiler-uitvoer begrijpen

Voer deze opdracht uit om 1 document uit de verzameling system.profile te krijgen.

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

Uitgang:

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

Dit is een document uit de system.profile-verzameling. We kunnen zien dat het veel nuttige informatie voor ons bevat. Laten we enkele van de nuttige velden uit dit document begrijpen.

  • Op veld slaat het type bewerking op.
  • Ns-veld slaat doeldatabase en collectienaam op
  • Query-veld slaat de informatie over de query en het resultaat op. Het resultaat wordt afgekapt als de documentgrootte groter is dan 50 KB
  • keysExamined slaat het aantal indexsleutels op dat door DB is onderzocht om de query uit te voeren
  • docsExamined slaat het totale aantal documenten op dat door de database is onderzocht
  • Nreturned slaat het aantal documenten op dat door de zoekopdracht is geretourneerd
  • Millis bevat de werkelijke tijd in milliseconden die deze query nodig heeft om uit te voeren
  • Ts slaat het tijdstempel van de zoekopdracht op

We kunnen veel informatie krijgen over hoe de query-bewerking is uitgevoerd door het databasesysteem door deze velden te onderzoeken en deze te gebruiken om de prestaties van de database te optimaliseren. Als de waarde keysExamined bijvoorbeeld groter is dan de waarde "nreturns", laat dit zien dat DB veel indexen scant om het resultaat te krijgen, wat nooit een goed teken is. U moet uw database-indexen dus goed aanpassen.

Multiplenines Word een MongoDB DBA - MongoDB naar productie brengenLeer over wat u moet weten om MongoDB gratis te implementeren, bewaken, beheren en schalen

Nuttige zoekopdrachten om Profiler-uitvoer te analyseren

  1. De meest bruikbare zoekopdracht is om alle documenten op millis te sorteren om de top 10 van langzame zoekopdrachten te krijgen.

    db.system.profile.find().sort({millis:-1}).limit(10).pretty();
  2. Vind alle zoekopdrachten die meer dan 30 milliseconden duren om uit te voeren

    db.system.profile.find({millis:{$gt:30}}).pretty()
  3. Vind de 10 langzaamste aggregatie-/opdrachtquery's

    db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
  4. Vind alle bewerkingen waarvoor sommige documenten zijn verplaatst

    db.system.profile.find({moved:true}).pretty()
  5. Zoek zoekopdrachten die grote scans op de database uitvoeren

    db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
  6. Vind de maximale en gemiddelde tijd die nodig is voor elk type bewerking met behulp van aggregatie

    db.system.profile.aggregate(
    { $group : { 
       _id :"$op", 
       count:{$sum:1},
       "max_time":{$max:"$millis"},
       "avg_time":{$avg:"$millis"}
    }}).pretty()
  7. Vind de maximale en gemiddelde tijd die zoekopdrachten in elke database in beslag nemen met behulp van aggregatie

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

Conclusie

MongoDB Profiler is een zeer nuttig hulpmiddel om inzicht te krijgen in hoe de database eventuele vragen/opdrachten uitvoert. Als u van plan bent Profiler in een productieomgeving te gebruiken, moet u de juiste tests uitvoeren, omdat dit van invloed kan zijn op uw databasedoorvoer, vooral wanneer u alle query's registreert, d.w.z. het profileringsniveau is ingesteld op 2. Een ander aspect van het gebruik van deze tool is het definiëren van wat langzaam betekent. U moet beslissen dat wat alle vragen als traag kunnen worden beschouwd. Op basis daarvan kunt u de minimumdrempel instellen om de query's te loggen. Dit vermindert de impact van het gebruik van deze tool op de DB-prestaties


  1. verbinding maken met lokale mongodb vanuit docker-container

  2. Globale initialisatie mislukt:BadValue Ongeldige of geen gebruikerslandinstelling ingesteld. Zorg ervoor dat de omgevingsvariabelen LANG en/of LC_* correct zijn ingesteld

  3. Hoe de MongoDB-insertprestaties te verbeteren

  4. Mongodb en MAMP