sql >> Base de Datos >  >> NoSQL >> MongoDB

Descripción general del generador de perfiles de base de datos de MongoDB

Cualquier tipo de base de datos enfrenta problemas de rendimiento cuando los datos crecen. Pasos simples como reescribir consultas problemáticas o analizar/optimizar el esquema de la base de datos pueden mejorar drásticamente el rendimiento de la base de datos. MongoDB proporciona algunas características excelentes que hacen que este proceso sea muy fácil para los administradores de bases de datos. Por ejemplo, Query Profiler, Mongostat, Mongotop, buen soporte de registro, etc.

La mayoría de las veces, es el sistema de base de datos el que decide cómo se ejecutará una consulta. El usuario solo proporciona los detalles sobre el resultado que desea a través de un lenguaje de consulta. En este artículo, discutiremos cómo podemos usar el generador de perfiles de consultas MongoDB para encontrar consultas lentas y que consumen muchos recursos. MongoDB Profiler es una herramienta integrada que le brinda información real sobre el nivel de consulta. Le permite analizar todas las consultas que está ejecutando el sistema de base de datos.

Habilitación/Configuración del MongoDB Profiler

En general, el perfilador almacena todos los datos en la colección system.profile que se puede consultar como cualquier otra colección normal de MongoDB. Profiler tiene 3 niveles de creación de perfiles. De forma predeterminada, el nivel del generador de perfiles se establece en 0 para cualquier base de datos.

Nivel 0 Profiler no registrará ningún dato
Nivel 1 Profiler registrará solo operaciones lentas por encima de cierto umbral
Nivel 2 Profiler registrará todas las operaciones

Puede ejecutar los siguientes comandos para obtener información sobre el generador de perfiles.

  • Para obtener el nivel de perfil actual.

    db.getProfilingLevel()
    Salida:
    0
  • Para verificar el estado actual del perfil

    db.getProfilingStatus()
    Salida:
    { "was" : 0, "slowms" : 100 }
  • Para establecer el nivel de perfil

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

    MongoDB imprimirá el nivel de generación de perfiles anterior y devolverá OK, lo que significa que el nivel de generación de perfiles está establecido en 1 ahora.

    Slowms es un valor de umbral para el generador de perfiles, lo que significa que el generador de perfiles registrará todas las consultas que toman más tiempo que el valor de umbral para ejecutarse.

Comprender la salida del generador de perfiles

Ejecute este comando para obtener 1 documento de la colección system.profile.

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

Salida:

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

Este es un documento de la colección system.profile. Podemos ver que contiene mucha información útil para nosotros. Comprendamos algunos de los campos útiles de este documento.

  • El campo Op almacena el tipo de operación.
  • El campo Ns almacena la base de datos de destino y el nombre de la colección
  • El campo Consulta almacena la información sobre la consulta y el resultado. El resultado se truncará si el tamaño del documento es superior a 50 KB
  • keysExamined almacena el número de claves de índice examinadas por DB para ejecutar la consulta
  • docsExamined almacena el número total de documentos examinados por la base de datos
  • Nreturned almacena el número de documentos devueltos por la consulta
  • Millis contiene el tiempo real en milisegundos que tarda esta consulta en ejecutarse
  • Ts almacena la marca de tiempo de la consulta

Podemos obtener mucha información sobre cómo el sistema de la base de datos llevó a cabo la operación de consulta al examinar estos campos y usarlos para optimizar el rendimiento de la base de datos. Por ejemplo, si el valor de keysExamined es mayor que el valor "nreturns", entonces muestra que DB está escaneando muchos índices para obtener el resultado, lo que nunca es una buena señal. Por lo tanto, debe ajustar los índices de su base de datos correctamente.

Varios nueves Conviértase en un administrador de bases de datos de MongoDB - Llevando MongoDB a la producción Obtenga información sobre lo que necesita saber para implementar, monitorear, administrar y escalar MongoDBDescargar gratis

Consultas útiles para analizar la salida del generador de perfiles

  1. La consulta más útil es ordenar todos los documentos por milisegundos para obtener las 10 consultas más lentas.

    db.system.profile.find().sort({millis:-1}).limit(10).pretty();
  2. Encuentra todas las consultas que tardan más de 30 milisegundos en ejecutarse

    db.system.profile.find({millis:{$gt:30}}).pretty()
  3. Encuentre las 10 consultas de comando/agregación más lentas

    db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
  4. Encuentre todas las operaciones para las cuales se movieron algunos documentos

    db.system.profile.find({moved:true}).pretty()
  5. Encuentre consultas que están realizando escaneos grandes en la base de datos

    db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
  6. Encuentre el tiempo máximo y promedio que toma cada tipo de operación usando la agregación

    db.system.profile.aggregate(
    { $group : { 
       _id :"$op", 
       count:{$sum:1},
       "max_time":{$max:"$millis"},
       "avg_time":{$avg:"$millis"}
    }}).pretty()
  7. Encuentre el tiempo máximo y promedio que tardan las consultas en cada base de datos mediante la agregación

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

Conclusión

MongoDB Profiler es una herramienta muy útil para obtener información sobre cómo la base de datos realiza consultas/comandos. Si planea usar el generador de perfiles en un entorno de producción, debe realizar las pruebas adecuadas porque puede afectar el rendimiento de su base de datos, especialmente cuando está registrando todas las consultas, es decir, el nivel de perfilado se establece en 2. Otro aspecto del uso de esta herramienta es definir qué medios lentos. Debe decidir que todas las consultas pueden considerarse lentas. En base a eso, puede establecer el umbral mínimo para registrar las consultas. Esto reducirá el impacto del uso de esta herramienta en el rendimiento de la base de datos