2012-11-27 5 views
4

MongoDB에서 느린 쿼리로부터 앱을 보호 할 수있는 방법이 있습니까? 내 응용 프로그램에는 필터가 여러 가지 가능성이 있으며 이러한 모든 쿼리를 모니터링하고 있지만 인덱스 정의가 누락되어 성능을 저하시키고 싶지는 않습니다.느린 MongoDB 쿼리를 자동으로 종료하는 방법은 무엇입니까?

+3

인덱스를 사용하지 않는 쿼리를 금지 할 수 있습니다. 이렇게하려면'notablescan' 옵션을'true'로 설정하여 MongoDB를 설정하십시오. – ghik

+0

나는 아래의 해답 중 어느 것도 특히 만족스럽지 못하다는 것을 알고 있습니다. 현재이 방법이 없다고 생각하기 때문에, 대답은 "당신이 할 수 없다" 그 (아직) ". – acm

+0

@acm 2.6을 사용하는 방법이 있습니다. 내 대답을 여기에서 확인할 수 있습니다. –

답변

2

언급 된 @ ignik과 같은 'notablescan'옵션은 색인을 사용하지 않아서 느린 쿼리를 실행할 수 없게합니다. 그러나이 옵션은 서버에 대해 전역이며 프로덕션 환경에서 사용하기에 적합하지 않습니다. 또한 테이블 스캔 외에 느린 쿼리의 다른 소스로부터 사용자를 보호하지 않습니다.

불행히도 지금 당장 원하는 것을 직접 할 방법이 없다고 생각합니다. $ maxTime 또는 $ maxScan 쿼리 매개 변수를 추가하는 JIRA 티켓이 있습니다. 도움이 될 것 같은데, https://jira.mongodb.org/browse/SERVER-2212에 투표하십시오.

+0

이 옵션은 구현되었으며 버전 2.6 –

0

시간 인수를 전달하여 쿼리를 죽이는 것이 현재 지원되지 않는다고 생각합니다. 개발 측에서는 프로파일 러 레벨을 2로 설정할 수 있지만 발행 된 모든 쿼리를 기록합니다. 여기에서 얼마나 많은 시간이 걸리는 쿼리를 볼 수 있습니다. 나는 당신이 정확히 원했던 것이 아니라 모든 쿼리가 뚱뚱한 지에 대한 통찰력을 얻는 데 도움이된다. 그런 다음 당신의 앱 논리에서 그러한 쿼리가 시작된 경우를 정상적으로 처리 할 수있는 방법을 가질 수있다. 나는 대개이 접근 방식으로 도움이된다.

+1

에서 사용할 수 있습니다. 프로덕션 환경에서 프로파일 링을 유지하면 성능에 영향을 미치므로 좋지 않습니다. currentOp를 사용하여 사용자 조작을 감시하고 killOp를 사용하여 너무 오래 걸리는 것을 제거하는 것이 훨씬 더 좋습니다. –

+0

@AsyaKamsky 귀하의 의견에 감사드립니다. 그것에 대해 몰랐습니다 :) –

2

지금 버전이 2.6 인 경우 가능합니다. 자신의 press release에서 다음 볼 수 있습니다 MaxTimeMS 사업자 및 개발자들과

는 자원 활용의 더 나은 제어를 제공, 쿼리 자동 취소 를 지정할 수 있습니다;

따라서 MaxTimeMS을 사용하면 쿼리 실행 시간을 지정할 수 있습니다. 예를 들어 특정 쿼리가 200 밀리 초 이상 실행되는 것을 원하지 않습니다.

db.collection.find({ 
    // my query 
}).maxTimeMS(200) 

멋진 점은 다른 작업에 대해 다른 시간 초과를 지정할 수 있다는 점입니다.

OP의 질문에 대답에 답하십시오. 이를위한 전역 설정이 없습니다. 한 가지 이유는 서로 다른 쿼리가 서로 다른 최대 허용 시간을 가질 수 있기 때문입니다. 예를 들어 ID로 userInfo를 찾는 쿼리를 가질 수 있습니다. 이것은 매우 일반적인 작업이므로 초고속으로 실행해야합니다 (그렇지 않으면 우리가 뭔가 잘못하고있는 것입니다). 따라서 우리는 200ms보다 오래 실행하는 것을 용인 할 수 없습니다.

하지만 우리는 하루에 한 번 실행되는 일부 집계 쿼리도 가지고 있습니다. 이 작업을하려면 4 초 동안 실행하는 것이 좋습니다. 그러나 우리는 10 초 이상 견딜 수 없습니다. 그래서 maxTimeMS로 10000을 넣을 수 있습니다.

+1

어쨌든 글로벌 설정으로 만들 수 있습니까? –

+0

이것은 서버 설정이 아니므로 쿼리의 옵션이므로 응용 프로그램 쪽에서 만 서버 측에서 설정할 수 없습니다. –

+0

@IgorEscobar 죄송합니다. 귀하의 질문을 보지 못했습니다. 프로필에서 나는 php로 코드를 작성 했으므로 종료하려는 모든 쿼리에 대해이 'maxTimeMS'를 쿼리의 끝에 http://php.net/manual/en/mongocursor.maxtimems.php를 추가합니다 , 당신은 이것을 추가합니다. –

2

클라이언트 쪽에서 사용할 수있는 옵션 (2.6 릴리스부터 시작하는 maxTimeMS)이 있습니다.

서버 측에서는 모든 데이터베이스와 모든 작업에 영향을 미치고 시스템이 내부 작동을 위해 장기간 실행해야하는 경우 (예 : 복제 용 오류 발생)에도 영향을주기 때문에 매력적인 글로벌 옵션은 없습니다. 또한 쿼리 중 일부는 장기간 실행해도 괜찮습니다.

이 스크립트를 통해 쿼리를 실행 현재 모니터링하고 긴 사용자/클라이언트가 시작한 실행하는 사람을 죽일 것입니다 해결하는 올바른 방법 - 당신이 다음 디자인에 의해 오랫동안 실행하는 쿼리에 대해 예외에 구축 할 수 있습니다 , 또는 다른 쿼리/수집/등에 대해 다른 임계 값을 가질 수 있습니다.

그런 다음 db.currentOp() method (셸에서)을 사용하여 현재 실행중인 모든 작업을 볼 수 있습니다. "secs_running"필드는 작업이 실행 된 시간을 나타냅니다. 응용 프로그램/클라이언트가 시작하지 않은 장기 실행 작업을 종료하지 않도록주의하십시오. 예를 들어 샤드 된 클러스터에서 청크 마이그레이션과 같은 필수 시스템 작업이 될 수 있습니다.

관련 문제