Pergunta

É possível encontrar consultas no system.profile-Coleção de MongoDB-banco de dados que não terminou devido a um tempo limite?

Eu encontrei algumas consultas que correu mais do que o tempo especificado no $maxTimeMS.

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

Mas executou apenas um par de milissegundos mais, e não ter um campo error ou timeout. Existem campos que indicam um limite de tempo?

Foi útil?

Solução

Em um grande conjunto de dados, eu testei uma consulta que expira depois de 10 segundos:

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

(No meu caso, a coleção tem > 100 GB de dados e nenhum índice no campo foo).Eu procurei para a consulta usando:

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

e descobriram que os campos exception e exceptionCode são preenchidos:

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

Assim, a pesquisa para o campo exception deve dar-lhe o resultado desejado:

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

E se você explicitamente olhar para as consultas que se esgotou, tente:

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

Outras dicas

MongoDB alvos de operações para a rescisão se os associados do cursor excede o seu limite de tempo estipulado(maxTimeMS).Acredito que poucos millis mais vêm de duas coisas.

1) deve haver um processo interno que verifica periodicamente para obter o intervalo de verificação de sobrecarga (por exemplo, a cada 1ms)

2) o MongoDB termina operações que exceder o seu limite de tempo estipulado, usando o mesmo mecanismo db.killOp().MongoDB só termina uma operação em um de seus designado pontos de interrupção.Para atingir o ponto de interrupção pode levar alguns millis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a dba.stackexchange
scroll top