Domanda

È possibile trovare query nel file system.profile-Raccolta di un database MongoDB che non è terminato a causa di un timeout?

Ho trovato alcune query che sono durate più a lungo del tempo specificato in $maxTimeMS.

db.coll.find(
  { millis: {$gt: 1300}, "command.maxTimeMS": NumberLong(1300) },
  {millis: 1}
).sort(
  {millis: -1}
)

Ma correvano solo un paio di millisecondi in più e non avevano campo error O timeout. Ci sono campi che indicano un timeout?

È stato utile?

Soluzione

Su un set di dati piuttosto grande ho testato una query che scade dopo 10 secondi:

db.collection.find({"foo": "bar"}).maxTimeMS(10000)

(Nel mio caso la collezione ha > 100 GB di dati e nessun indice sul campo foo).Ho cercato la query utilizzando:

db.system.profile.find({"query.query" : { "foo" : "bar" }}).limit(5).sort({ts: -1}).pretty()

e ho scoperto che i campi exception E exceptionCode sono pieni:

"exception" : "operation exceeded time limit",
"exceptionCode" : 50,

Quindi ricerca del campo exception dovrebbe darti il ​​risultato desiderato:

db.system.profile.find({ "exception" : { "$exists" : 1 } }).limit(5).sort({ts: -1}).pretty()

E se cerchi esplicitamente le query scadute, prova:

db.system.profile.find( {"exceptionCode": 50} ).sort( {ts: -1} ).pretty()

Altri suggerimenti

MONGODB Obiettivi Operazioni per la risoluzione se il cursore associato supera il limite di tempo assegnato (Maxtimems).Credo che i pochi millis provengano da due cose.

1) Dovrebbe esserci un processo interno che controlla periodicamente in modo da ottenere il controllo dell'intervallo di controllo (ad esempio ogni 1 m)

2) Il mongodb termina le operazioni che superano il limite di tempo assegnato, utilizzando lo stesso meccanismo di db.killop ().MongoDB termina solo un'operazione in uno dei suoi punti di interruzione designati.Per raggiungere il punto di interruzione potrebbe richiedere pochi millis.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top