MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Преглед на MongoDB Database Profiler

Всеки тип база данни се сблъсква с проблеми с производителността, когато данните растат. Прости стъпки като пренаписване на проблемни заявки или анализиране/оптимизиране на схемата на базата данни могат драстично да подобрят производителността на базата данни. MongoDB предоставя някои отлични функции, които правят този процес много лесен за DBA. Например Query Profiler, Mongostat, Mongotop, добра поддръжка за регистриране и т.н.

През повечето време системата на базата данни е тази, която решава как да се изпълни заявката. Потребителят просто предоставя подробностите за резултата, който той/тя иска чрез език за заявки. В тази статия ще обсъдим как можем да използваме MongoDB профайлър на заявки за намиране на бавни и ресурсоемки заявки. MongoDB Profiler е вграден инструмент, който ви дава действителните прозрения на ниво заявка. Позволява ви да анализирате всички заявки, които се изпълняват от системата на базата данни.

Активиране/конфигуриране на MongoDB Profiler

Обикновено профайлърът съхранява всички данни в колекцията system.profile, която може да бъде заявена като всяка друга нормална колекция на MongoDB. Profiler има 3 нива на профилиране. По подразбиране нивото на профайлъра е настроено на 0 за всяка база данни.

Ниво 0 Профилът няма да регистрира никакви данни
Ниво 1 Профилърът ще регистрира само бавни операции над някакъв праг
Ниво 2 Профилърът ще регистрира всички операции

Можете да изпълните следните команди, за да получите информация за профайлъра.

  • За да получите текущо ниво на профилиране.

    db.getProfilingLevel()
    Изход:
    0
  • За да проверите текущото състояние на профилиране

    db.getProfilingStatus()
    Изход:
    { "was" : 0, "slowms" : 100 }
  • За да зададете ниво на профилиране

    db.setProfilingLevel(1, 40)
    Изход:
    { "was" : 0, "slowms" : 100, "ok" : 1 }

    MongoDB ще отпечата старото ниво на профилиране и ще върне OK, което означава, че нивото на профилиране е зададено на 1 сега.

    Slowms е прагова стойност за профайлъра, което означава, че той ще регистрира всички заявки, чието изпълнение отнема повече време от праговата стойност.

Разбиране на изхода на Profiler

Изпълнете тази команда, за да получите 1 документ от колекцията system.profile.

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

Изход:

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

Това е един документ от колекцията system.profile. Виждаме, че съдържа много полезна информация за нас. Нека разберем някои от полезните полета от този документ.

  • Полето Op съхранява типа на операцията.
  • Полето Ns съхранява целева база данни и име на колекция
  • Полето за заявка съхранява информацията за заявката и резултата. Резултатът ще бъде съкратен, ако размерът на документа е по-голям от 50 КБ
  • keysExamined съхранява броя на индексните ключове, проверени от DB за изпълнение на заявката.
  • docsExamined съхранява общия брой документи, проверени от DB
  • Nreturned съхранява броя документи, върнати от заявката
  • Милис съдържа действителното време в милисекунди, необходимо на тази заявка за изпълнение
  • Ts съхранява времевата марка на заявката

Можем да получим много информация за това как операцията по заявка е извършена от системата на базата данни, като разгледаме тези полета и я използваме за оптимизиране на производителността на базата данни. Например, ако стойността на keysExamined е по-голяма от стойността на „nreturns“, това показва, че DB сканира много индекси, за да получи резултата, който никога не е добър знак. Така че трябва да коригирате правилно индексите на вашата база данни.

Severalnines Станете DBA на MongoDB – Пренасяне на MongoDB в Производството Научете какво трябва да знаете, за да внедрите, наблюдавате, управлявате и мащабирате MongoDB Изтеглете безплатно

Полезни заявки за анализиране на изхода на Profiler

  1. Най-полезната заявка е да сортирате всички документи по милиони, за да получите първите 10 бавни заявки.

    db.system.profile.find().sort({millis:-1}).limit(10).pretty();
  2. Намерете всички заявки, които отнемат повече от 30 милисекунди за изпълнение

    db.system.profile.find({millis:{$gt:30}}).pretty()
  3. Намерете топ 10 най-бавни заявки за агрегиране/команди

    db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
  4. Намерете всички операции, за които са преместени някои документи

    db.system.profile.find({moved:true}).pretty()
  5. Намерете заявки, които извършват големи сканирания на базата данни

    db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
  6. Намерете максималното и средното време, необходимо за всеки тип операции, като използвате агрегиране

    db.system.profile.aggregate(
    { $group : { 
       _id :"$op", 
       count:{$sum:1},
       "max_time":{$max:"$millis"},
       "avg_time":{$avg:"$millis"}
    }}).pretty()
  7. Намерете максималното и средното време, необходимо на заявките във всяка база данни, като използвате агрегиране

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

Заключение

MongoDB Profiler е много полезен инструмент за получаване на представа за това как базата данни изпълнява всякакви заявки/команди. Ако планирате да използвате профайлър в производствена среда, тогава трябва да направите правилно тестване, защото това може да повлияе на пропускателната способност на вашата база данни, особено когато регистрирате всички заявки, т.е. нивото на профилиране е настроено на 2. Друг аспект на използването на този инструмент е дефинирането на какво бавно означава. Трябва да решите, че всички заявки могат да се считат за бавни. Въз основа на това можете да зададете минималния праг за регистриране на заявките. Това ще намали въздействието от използването на този инструмент върху производителността на DB


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb заявка с полета в същите документи

  2. MongoDB -- Задаване на условен израз в .find()

  3. Как да предадете ObjectId от MongoDB в MVC.net

  4. Предимства на MongoDB | Недостатъци на MongoDB

  5. Използване на map/reduce за картографиране на свойствата в колекция