Wie finde ich Abfragen, bei denen in MongoDB eine Zeitüberschreitung aufgetreten ist?
-
28-09-2020 - |
Frage
Ist es möglich, Abfragen in der zu finden? system.profile
-Sammlung einer MongoDB-Datenbank, die aufgrund eines Timeouts nicht beendet wurde?
Ich habe einige Abfragen gefunden, die länger als die in angegebene Zeit ausgeführt wurden $maxTimeMS
.
db.coll.find(
{ millis: {$gt: 1300}, "command.maxTimeMS": NumberLong(1300) },
{millis: 1}
).sort(
{millis: -1}
)
Aber sie liefen nur ein paar Millisekunden länger und hatten kein Feld error
oder timeout
. Gibt es Felder, die eine Zeitüberschreitung anzeigen?
Lösung
An einem ziemlich großen Datensatz habe ich eine Abfrage getestet, die nach 10 Sekunden abbricht:
db.collection.find({"foo": "bar"}).maxTimeMS(10000)
(In meinem Fall hat die Sammlung > 100 GB
von Daten und kein Index für das Feld foo
).Ich habe nach der Abfrage gesucht mit:
db.system.profile.find({"query.query" : { "foo" : "bar" }}).limit(5).sort({ts: -1}).pretty()
und fand, dass die Felder exception
Und exceptionCode
sind gefüllt:
"exception" : "operation exceeded time limit",
"exceptionCode" : 50,
Also auf der Suche nach dem Feld exception
sollte Ihnen das gewünschte Ergebnis liefern:
db.system.profile.find({ "exception" : { "$exists" : 1 } }).limit(5).sort({ts: -1}).pretty()
Und wenn Sie explizit nach Abfragen suchen, bei denen eine Zeitüberschreitung aufgetreten ist, versuchen Sie Folgendes:
db.system.profile.find( {"exceptionCode": 50} ).sort( {ts: -1} ).pretty()
Andere Tipps
MongoDB zielt darauf ab, Vorgänge zu beenden, wenn der zugehörige Cursor sein zugewiesenes Zeitlimit (maxTimeMS) überschreitet.Ich glaube, dass die paar Milli mehr auf zwei Dinge zurückzuführen sind.
1) Es sollte einen internen Prozess geben, der regelmäßig überprüft, sodass Sie den Prüfintervall-Overhead erhalten (z. B. alle 1 ms).
2) MongoDB beendet Vorgänge, die ihr zugewiesenes Zeitlimit überschreiten, und verwendet dabei den gleichen Mechanismus wie db.killOp().MongoDB beendet einen Vorgang nur an einem seiner festgelegten Unterbrechungspunkte.Es kann einige Millisekunden dauern, bis der Unterbrechungspunkt erreicht ist.