質問

は、タイムアウトのために終了しなかった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()
.

exceptionexceptionCodeのフィールドが入力されていることがわかりました。

"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つでの操作を終了します。割り込みポイントに到達するには、ミリスがかかることがあります。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top