

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 장기 실행 쿼리
<a name="anti-pattern-long-running-queries"></a>

## 개요
<a name="long-queries-overview"></a>

장기 실행 쿼리는 클러스터 전반의 성능 문제로 이어질 수 있습니다. 이러한 쿼리는 Amazon DocumentDB의 다중 버전 동시성 제어(MVCC) 가비지 수집 프로세스를 방해하여 이전 버전의 문서가 누적되고 클러스터 전체에서 성능이 저하될 수 있습니다. Amazon DocumentDB는 런어웨이 쿼리가 리소스를 무기한 소비하는 것을 제한하는 안전 메커니즘으로 2시간의 서버 측 제한 시간을 구현합니다.

**장기 실행 쿼리란 무엇입니까?**
+ 장기간 실행되는 쿼리(일반적으로 > 30분)
+ 몇 시간 동안 활성 상태로 유지되는 열린 커서(커서가 활성 상태인 경우 2시간 제한 시간이 적용되지 않음)

## 클러스터에 미치는 영향
<a name="long-queries-impact"></a>

**장기 실행 쿼리는 가비지 수집 프로세스를 방해할 수 있습니다.**
+ **이전 버전 누적**: 가비지 수집기가 이전 문서 버전을 회수할 수 없음
+ **컬렉션 및 인덱스 팽창**: 컬렉션 및 인덱스 항목은 시간이 지남에 따라 누적되고 팽창이 증가하여 스토리지 비용이 증가할 수 있습니다.
+ **CPU 및 메모리 압력**: 증가된 수의 이전 문서 버전, 인덱스 항목 및 트랜잭션 IDs를 비효율적으로 처리하여 CPU 및 메모리 압력이 증가합니다.

장기 실행 쿼리 → GC 차단 → 스토리지 증가 → CPU 및 메모리 압력 → 더 긴 쿼리

## 모니터링 및 감지
<a name="long-queries-monitoring"></a>

**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 가용성이 감소하고 가비지 수집 주기가 길어질 수도 있습니다.

## 문제 해결 전략
<a name="long-queries-remediation"></a>
+ 애플리케이션에서 쿼리 제한 시간 구현
+ 더 오랜 시간 동안 커서를 유지하지 마십시오.
+ 더 나은 성능을 위해 쿼리를 최적화합니다.
+ 쓰기 작업 일괄 처리 선호