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()
다른 팁
MongoDB 관련 커서가 할당 된 시간 제한 (MaxTimems)을 초과하면 종료를위한 작업 조작을 목표로합니다.나는 몇 밀리가 두 가지에서 더 많은 것을 믿는다.
1) 주기적으로 체크인하여 체크 간격 오버 헤드 (예 : 1ms마다)를 얻을 수있는 내부 프로세스가 있어야합니다
2) MongoDB는 DB.Killop ()과 동일한 메커니즘을 사용하여 할당 된 시간 제한을 초과하는 작업을 종료합니다.MongoDB는 지정된 인터럽트 포인트 중 하나에서만 작업을 종료합니다.인터럽트 지점에 도달하려면 밀리스가 거의 없을 수 있습니다.