MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Visão geral do criador de perfil de banco de dados MongoDB


Qualquer tipo de banco de dados enfrenta problemas de desempenho quando os dados crescem. Etapas simples, como reescrever consultas problemáticas ou analisar/otimizar o esquema do banco de dados, podem melhorar drasticamente o desempenho do banco de dados. O MongoDB fornece alguns recursos excelentes que tornam esse processo muito fácil para DBAs. Por exemplo, Query Profiler, Mongostat, Mongotop, bom suporte de registro, etc.

Na maioria das vezes, é o sistema de banco de dados que decide como uma consulta será executada. O usuário apenas fornece os detalhes sobre o resultado que deseja por meio de uma linguagem de consulta. Neste artigo, discutiremos como podemos usar o criador de perfil de consulta MongoDB para encontrar consultas lentas e com uso intensivo de recursos. O MongoDB Profiler é uma ferramenta integrada que fornece informações reais sobre o nível de consulta. Permite analisar todas as consultas que estão sendo executadas pelo sistema de banco de dados.

Ativando/configurando o MongoDB Profiler


Geralmente, o criador de perfil armazena todos os dados na coleção system.profile que pode ser consultada como qualquer outra coleção normal do MongoDB. O Profiler tem 3 níveis de criação de perfil. Por padrão, o nível do criador de perfil é definido como 0 para qualquer banco de dados.
Nível 0 Profiler não registrará nenhum dado
Nível 1 O Profiler registrará apenas operações lentas acima de algum limite
Nível 2 Profiler registrará todas as operações

Você pode executar os comandos a seguir para obter algumas informações sobre o criador de perfil.

  • Para obter o nível de perfil atual.
    db.getProfilingLevel()
    Saída:
    0

  • Para verificar o status de criação de perfil atual
    db.getProfilingStatus()
    Saída:
    { "was" : 0, "slowms" : 100 }

  • Para definir o nível de perfil
    db.setProfilingLevel(1, 40)
    Saída:
    { "was" : 0, "slowms" : 100, "ok" : 1 }

    O MongoDB imprimirá o nível de perfil antigo e retornará OK, o que significa que o nível de perfil está definido como 1 agora.

    Slowms é um valor limite para o criador de perfil, o que significa que o criador de perfil registrará todas as consultas que levam mais tempo do que o valor limite para executar.

Compreendendo a saída do Profiler


Execute este comando para obter 1 documento da coleção system.profile.
db.system.profile.find().limit(1).pretty()

Saída:
{
    "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 é um documento da coleção system.profile. Podemos ver que ele contém muitas informações úteis para nós. Vamos entender alguns dos campos úteis deste documento.
  • O campo Op armazena o tipo de operação.
  • O campo Ns armazena o banco de dados de destino e o nome da coleção
  • O campo de consulta armazena as informações sobre a consulta e o resultado. O resultado será truncado se o tamanho do documento for maior que 50 KB
  • keysExamined armazena o número de chaves de índice examinadas pelo banco de dados para executar a consulta
  • docsExamined armazena o número total de documentos examinados pelo banco de dados
  • Nreturned armazena o número de documentos retornados pela consulta
  • Millis contém o tempo real em milissegundos que esta consulta leva para ser executada
  • Ts armazena o carimbo de data/hora da consulta

Podemos obter muitas informações sobre como a operação de consulta foi realizada pelo sistema de banco de dados examinando esses campos e usá-los para otimizar o desempenho do banco de dados. Por exemplo, se o valor keysExamined for maior que o valor “nreturns”, isso mostra que o banco de dados está verificando muitos índices para obter o resultado que nunca é um bom sinal. Portanto, você deve ajustar os índices do banco de dados corretamente.
Vários noves Torne-se um DBA do MongoDB - Trazendo o MongoDB para a produçãoSaiba mais sobre o que você precisa saber para implantar, monitorar, gerenciar e dimensionar o MongoDBBaixe gratuitamente

Consultas úteis para analisar a saída do Profiler


  1. A consulta mais útil é classificar todos os documentos por milissegundos para obter as 10 principais consultas lentas.
    db.system.profile.find().sort({millis:-1}).limit(10).pretty();

  2. Encontre todas as consultas que levam mais de 30 milissegundos para serem executadas
    db.system.profile.find({millis:{$gt:30}}).pretty()

  3. Encontre as 10 consultas de agregação/comando mais lentas
    db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();

  4. Encontre todas as operações para as quais alguns documentos foram movidos
    db.system.profile.find({moved:true}).pretty()

  5. Localizar consultas que estão realizando grandes varreduras no banco de dados
    db.system.profile.find({docsExamined:{$gt:10000}}).pretty()

  6. Encontre o tempo máximo e médio gasto por cada tipo de operação usando agregação
    db.system.profile.aggregate(
    { $group : { 
       _id :"$op", 
       count:{$sum:1},
       "max_time":{$max:"$millis"},
       "avg_time":{$avg:"$millis"}
    }}).pretty()

  7. Encontre o tempo máximo e médio de consultas em cada banco de dados usando agregação
    db.system.profile.aggregate(
    { $group : {
      _id :"$ns",
      count:{$sum:1}, 
      "max_time":{$max:"$millis"}, 
      "avg_time":{$avg:"$millis"}  
    }}.pretty()

Conclusão


O MongoDB Profiler é uma ferramenta muito útil para obter insights de como o banco de dados realiza quaisquer consultas/comandos. Se você planeja usar o criador de perfil em um ambiente de produção, faça os testes adequados, pois isso pode afetar a taxa de transferência do banco de dados, especialmente quando você está registrando todas as consultas, ou seja, o nível de perfil é definido como 2. Outro aspecto do uso dessa ferramenta é definir o que meios lentos. Você tem que decidir que todas as consultas podem ser consideradas lentas. Com base nisso, você pode definir o limite mínimo para registrar as consultas. Isso reduzirá o impacto do uso desta ferramenta no desempenho do banco de dados