如何查找 MongoDB 中超时的查询?
-
28-09-2020 - |
题
是否可以在查询中找到 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()
并发现字段 exception
和 exceptionCode
已填充:
"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 仅在其指定的中断点之一终止操作。要到达中断点可能需要几毫秒。
不隶属于 dba.stackexchange