Como encontrar consultas que esgotado o MongoDB?
-
28-09-2020 - |
Pergunta
É possível encontrar consultas no system.profile
-Coleção de MongoDB-banco de dados que não terminou devido a um tempo limite?
Eu encontrei algumas consultas que correu mais do que o tempo especificado no $maxTimeMS
.
db.coll.find(
{ millis: {$gt: 1300}, "command.maxTimeMS": NumberLong(1300) },
{millis: 1}
).sort(
{millis: -1}
)
Mas executou apenas um par de milissegundos mais, e não ter um campo error
ou timeout
. Existem campos que indicam um limite de tempo?
Solução
Em um grande conjunto de dados, eu testei uma consulta que expira depois de 10 segundos:
db.collection.find({"foo": "bar"}).maxTimeMS(10000)
(No meu caso, a coleção tem > 100 GB
de dados e nenhum índice no campo foo
).Eu procurei para a consulta usando:
db.system.profile.find({"query.query" : { "foo" : "bar" }}).limit(5).sort({ts: -1}).pretty()
e descobriram que os campos exception
e exceptionCode
são preenchidos:
"exception" : "operation exceeded time limit",
"exceptionCode" : 50,
Assim, a pesquisa para o campo exception
deve dar-lhe o resultado desejado:
db.system.profile.find({ "exception" : { "$exists" : 1 } }).limit(5).sort({ts: -1}).pretty()
E se você explicitamente olhar para as consultas que se esgotou, tente:
db.system.profile.find( {"exceptionCode": 50} ).sort( {ts: -1} ).pretty()
Outras dicas
MongoDB alvos de operações para a rescisão se os associados do cursor excede o seu limite de tempo estipulado(maxTimeMS).Acredito que poucos millis mais vêm de duas coisas.
1) deve haver um processo interno que verifica periodicamente para obter o intervalo de verificação de sobrecarga (por exemplo, a cada 1ms)
2) o MongoDB termina operações que exceder o seu limite de tempo estipulado, usando o mesmo mecanismo db.killOp().MongoDB só termina uma operação em um de seus designado pontos de interrupção.Para atingir o ponto de interrupção pode levar alguns millis.