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.
Saída:db.getProfilingLevel()
0
-
Para verificar o status de criação de perfil atual
Saída:db.getProfilingStatus()
{ "was" : 0, "slowms" : 100 }
-
Para definir o nível de perfil
Saída:db.setProfilingLevel(1, 40)
{ "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
-
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();
-
Encontre todas as consultas que levam mais de 30 milissegundos para serem executadas
db.system.profile.find({millis:{$gt:30}}).pretty()
-
Encontre as 10 consultas de agregação/comando mais lentas
db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
-
Encontre todas as operações para as quais alguns documentos foram movidos
db.system.profile.find({moved:true}).pretty()
-
Localizar consultas que estão realizando grandes varreduras no banco de dados
db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
-
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()
-
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