MongoDBでタイムアウトしたクエリを見つける方法
-
28-09-2020 - |
質問
は、タイムアウトのために終了しなかったMongoDBデータベースのsystem.profile
-collectionでクエリを見つけることができますか?
$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,
.
では、Field exception
を検索する必要があります。
db.system.profile.find({ "exception" : { "$exists" : 1 } }).limit(5).sort({ts: -1}).pretty()
.
そしてタイムアウトしたクエリを明示的に探す場合は、次のようにしてください。
db.system.profile.find( {"exceptionCode": 50} ).sort( {ts: -1} ).pretty()
. 他のヒント
MongoDB関連するカーソルが割り当てられた制限時間(MaxTimems)を超えた場合、終了の操作をターゲットにします。私は数ミリスが2つのことから来ると思います。
1)定期的にチェックする内部プロセスがあるため、チェック間隔のオーバーヘッド(たとえば1msごとに)
2)MongoDBは、db.killop()と同じメカニズムを使用して、割り当てられた制限時間を超える操作を終了します。MongoDBは、指定された割り込みポイントの1つでの操作を終了します。割り込みポイントに到達するには、ミリスがかかることがあります。
所属していません dba.stackexchange