是否可以在查询中找到 system.profile- 由于超时而未完成的 MongoDB 数据库的集合?

我发现一些查询的运行时间比中指定的时间长 $maxTimeMS.

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

但他们只多跑了几毫秒,并且没有字段 error 或者 timeout. 是否有字段指示超时?

有帮助吗?

解决方案

在一个相当大的数据集上,我测试了一个 10 秒后超时的查询:

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

(就我而言,该集合有 > 100 GB 的数据并且该字段上没有索引 foo)。我使用以下方式搜索查询:

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

并发现字段 exceptionexceptionCode 已填充:

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

所以寻找领域 exception 应该给你想要的结果:

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

如果您明确查找超时的查询,请尝试:

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

其他提示

如果关联的游标超过其分配的时间限制 (maxTimeMS),MongoDB 将终止操作。我相信多几毫秒来自两件事。

1) 应该有一个内部进程定期检查,这样你就会得到检查间隔开销(例如每 1ms)

2) MongoDB 使用与 db.killOp() 相同的机制终止超出其分配时间限制的操作。MongoDB 仅在其指定的中断点之一终止操作。要到达中断点可能需要几毫秒。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top