Comment trouver les requêtes qui a expiré dans MongoDB?
-
28-09-2020 - |
Question
Est-il possible de trouver des requêtes dans la system.profile
-Collection d'un MongoDB-base de données qui n'a pas fini à cause d'un dépassement de délai?
J'ai trouvé certaines requêtes qui a couru plus longtemps que la durée spécifiée dans $maxTimeMS
.
db.coll.find(
{ millis: {$gt: 1300}, "command.maxTimeMS": NumberLong(1300) },
{millis: 1}
).sort(
{millis: -1}
)
Mais ils ne s'exécutaient quelques millisecondes plus, et n'ont pas un champ error
ou timeout
. Existe-il des champs qui indiquent un délai d'attente?
La solution
Sur un assez vaste ensemble de données, j'ai testé une requête qui s'éteint après 10 secondes:
db.collection.find({"foo": "bar"}).maxTimeMS(10000)
(Dans mon cas, la collection a > 100 GB
de données et pas d'index sur le champ foo
).J'ai cherché la requête à l'aide de:
db.system.profile.find({"query.query" : { "foo" : "bar" }}).limit(5).sort({ts: -1}).pretty()
et a constaté que les champs exception
et exceptionCode
sont remplies:
"exception" : "operation exceeded time limit",
"exceptionCode" : 50,
Donc, à la recherche pour le champ exception
devrait vous donner le résultat souhaité:
db.system.profile.find({ "exception" : { "$exists" : 1 } }).limit(5).sort({ts: -1}).pretty()
Et si vous l'avez explicitement look pour les requêtes qui est venu à expiration, essayez:
db.system.profile.find( {"exceptionCode": 50} ).sort( {ts: -1} ).pretty()
Autres conseils
MongoDB cibles des opérations de résiliation si le curseur dépasse ses limites du temps imparti(maxTimeMS).Je crois que le peu de millis plus venir de deux choses.
1) Il devrait y avoir un processus interne qui vérifie périodiquement de façon à obtenir l'intervalle de vérification, les frais généraux (par exemple toutes les 1ms)
2) MongoDB met fin à des opérations qui dépassent les limites du temps imparti, en utilisant le même mécanisme que db.killOp().MongoDB ne prend fin qu'à une opération à l'un de ses désigné interrompre points.Pour atteindre le point d'interruption, il pourrait prendre quelques millis.