기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
장기 실행 쿼리
개요
장기 실행 쿼리는 클러스터 전반의 성능 문제로 이어질 수 있습니다. 이러한 쿼리는 Amazon DocumentDB의 다중 버전 동시성 제어(MVCC) 가비지 수집 프로세스를 방해하여 이전 버전의 문서가 누적되고 클러스터 전체에서 성능이 저하될 수 있습니다. Amazon DocumentDB는 런어웨이 쿼리가 리소스를 무기한 소비하는 것을 제한하는 안전 메커니즘으로 2시간의 서버 측 제한 시간을 구현합니다.
장기 실행 쿼리란 무엇입니까?
-
장기간 실행되는 쿼리(일반적으로 > 30분)
-
몇 시간 동안 활성 상태로 유지되는 열린 커서(커서가 활성 상태인 경우 2시간 제한 시간이 적용되지 않음)
클러스터에 미치는 영향
장기 실행 쿼리는 가비지 수집 프로세스를 방해할 수 있습니다.
-
이전 버전 누적: 가비지 수집기가 이전 문서 버전을 회수할 수 없음
-
컬렉션 및 인덱스 팽창: 컬렉션 및 인덱스 항목은 시간이 지남에 따라 누적되고 팽창이 증가하여 스토리지 비용이 증가할 수 있습니다.
-
CPU 및 메모리 압력: 증가된 수의 이전 문서 버전, 인덱스 항목 및 트랜잭션 IDs를 비효율적으로 처리하여 CPU 및 메모리 압력이 증가합니다.
장기 실행 쿼리 → GC 차단 → 스토리지 증가 → CPU 및 메모리 압력 → 더 긴 쿼리
모니터링 및 감지
1: 장기 실행 쿼리를 찾으려면 currentOp 명령을 사용합니다.
// To find a query running for more than 30 mins db.adminCommand({ aggregate: 1, pipeline: [ {$currentOp: {}}, {$match: {$or: [{secs_running: {$gt: 1800}}, {WaitState: {$exists: true}}]}}], cursor: {} });
2. 30분 이상 활성 상태인 커서를 찾으려면
// To find cursor which is running more than 30 mins db.adminCommand({ "currentOp": true, "active": true, "$all": true }).inprog.filter(function(op) { return op.desc == "Cursor" && op.secs_running > 1800 && op.active == true; }).sort((a, b) => b.microsecs_running - a.microsecs_running)
3. CloudWatch를 통한 가비지 수집기 진행 상황 모니터링
LongestRunningGCProcess- 가장 긴 활성 가비지 수집 프로세스의 초 단위 기간입니다. 1분마다 업데이트하고 1분 내에 완료되는 프로세스를 제외한 활성 작업만 추적합니다.
AvailableMVCCIds -0에 도달하기 전에 사용 가능한 나머지 쓰기 작업 수를 보여주는 카운터입니다. 이 카운터가 0에 도달하면 ID가 회수되고 재활용될 때까지 클러스터가 읽기 전용 모드로 전환됩니다. 카운터는 각 쓰기 작업에 따라 감소하고 폐영역 회수가 이전 MVCC ID를 재활용함에 따라 증가합니다.
참고
MVCC IDs와 가비지 수집 기간 연장은 장기 실행 쿼리에만 국한되지 않습니다. 리소스가 제한된 인스턴스에서 쓰기 집약적인 워크로드를 수행하면 MVCC ID 가용성이 감소하고 가비지 수집 주기가 길어질 수도 있습니다.
문제 해결 전략
-
애플리케이션에서 쿼리 제한 시간 구현
-
더 오랜 시간 동안 커서를 유지하지 마십시오.
-
더 나은 성능을 위해 쿼리를 최적화합니다.
-
쓰기 작업 일괄 처리 선호