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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top