Pregunta

¿Es posible encontrar consultas en el system.profile-¿Recopilación de una base de datos MongoDB que no finalizó debido a un tiempo de espera?

Encontré algunas consultas que duraron más del tiempo especificado en $maxTimeMS.

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

Pero sólo corrieron un par de milisegundos más y no tenían campo error o timeout. ¿Hay campos que indican un tiempo de espera?

¿Fue útil?

Solución

En un conjunto de datos bastante grande, probé una consulta que caduca después de 10 segundos:

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

(En mi caso la colección tiene > 100 GB de datos y sin índice en el campo foo).Busqué la consulta usando:

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

y descubrió que los campos exception y exceptionCode están llenos:

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

Entonces buscando el campo exception debería darle el resultado deseado:

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

Y si busca explícitamente consultas cuyo tiempo de espera haya expirado, intente:

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

Otros consejos

MongoDB apunta a la terminación de las operaciones si el cursor asociado excede su límite de tiempo asignado (maxTimeMS).Creo que los pocos mililitros más provienen de dos cosas.

1) Debe haber un proceso interno que verifique periódicamente para obtener el intervalo de verificación adicional (por ejemplo, cada 1 ms).

2) MongoDB finaliza las operaciones que exceden su límite de tiempo asignado, utilizando el mismo mecanismo que db.killOp().MongoDB solo finaliza una operación en uno de sus puntos de interrupción designados.Para alcanzar el punto de interrupción pueden ser necesarios unos pocos milisegundos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top