Amazon DocumentDB 인스턴스의 CPU 과다 사용 및 문제를 해결하려면 어떻게 해야 합니까?
Amazon DocumentDB(MongoDB 호환) 인스턴스의 높은 CPU 사용률 문제를 해결하고 싶습니다.
간략한 설명
Amazon DocumentDB 인스턴스의 CPU 사용률은 현재 할당된 리소스가 진행 중인 워크로드에서 어떻게 작동하는지 파악하는 데 도움이 됩니다.
다음과 같은 이유로 CPU 사용률이 증가할 수 있습니다.
- 사용자가 시작한 과중한 워크로드
- 비효율적인 쿼리
- 클러스터의 읽기 로드가 분산되지 않아 클러스터의 라이터에 과부하가 걸렸습니다
- 리더는 라이터보다 하드웨어 구성이 낮으므로 높은 쓰기 워크로드와 동기화할 수 없습니다
- Amazon DocumentDB 클러스터에서의 가비지 수집과 같은 내부 작업
- 데이터베이스 연결이 너무 많음(유휴)
- 짧은 연결 버스트
해결 방법
Amazon CloudWatch 지표 사용
CloudWatch를 사용하여 클러스터의 운영 지표를 수집하고 분석합니다. CloudWatch 지표를 사용하여 CPU와 그에 비례하는 지표 패턴을 장기간에 걸쳐 파악합니다.
CloudWatch 콘솔에서 다음 지표를 검토하고 모니터링합니다.
- DatabaseConnections 및 DatabaseConnectionsMax를 사용하여 관련 타임라인에 열려 있는 연결 수를 식별할 수 있습니다.
- WriteIOPs, ReadIOPs, ReadThroughput 및 WriteThroughput를 사용하여 Amazon DocumentDB 인스턴스의 전체 워크로드를 파악합니다.
- Amazon DocumentDB 인스턴스의 사용자 워크로드를 이해하려면 DocumentsDeleted, DocumentsInserted, DocumentsReturned and DocumentsUpdated를 사용하십시오.
- T3 또는 T4 인스턴스 클래스를 사용하는 경우 CPUCreditBalance 및 CPUSurplusCreditBalance를 검토하여 컴퓨팅 스로틀링을 확인합니다.
성능 개선 도우미 지표 사용
Amazon DocumentDB 성능 개선 도우미를 사용하여 데이터베이스 로드 및 대기 상태에 영향을 주는 쿼리를 파악합니다. 지표 관리 옵션에서 평균 활성 세션을 사용하여 로드 및 CPU 분포(시스템, 사용자 또는 합계)를 검토합니다.
평균 로드가 인스턴스의 vCPU 수를 초과하면 과부하가 발생합니다. 하지만 평균 로드가 DB 인스턴스 클래스의 vCPU 수보다 적다면 CPU 스로틀링 때문에 애플리케이션 지연이 발생하는 것이 아닐 수 있습니다. CPU 사용량 증가의 원인을 파악하려면 평균 로드를 검토하고 I/O, 잠금 및 래치와 관련된 대기 상태를 분석하십시오.
기본 데이터베이스 쿼리 사용
네이티브 쿼리를 사용하여 워크로드를 분석하고 CPU 사용량을 확인합니다. 현재 Amazon DocumentDB 인스턴스에서 실행 중인 모든 작업을 나열하려면 MongoDB 쉘을 사용하여 다음 쿼리를 실행합니다.
db.adminCommand({currentOp: 1, $all: });
차단되었거나 10초 이상 실행된 모든 쿼리를 나열하려면 currentOp 명령을 사용하는 다음 쿼리를 실행합니다.
db.adminCommand({ aggregate: 1, pipeline: [ {$currentOp: {}}, {$match: { $or: [ {secs_running: {$gt: 10}}, {WaitState: {$exists: true}} ] }}, {$project: { _id:0, opid: 1, secs_running: 1, WaitState: 1, blockedOn: 1, command: 1 }} ], cursor: {} });
시스템 사용량 결과를 분석하려면 CPU 사용량이 높은 인스턴스에서 다음 쿼리를 실행하십시오.
db.adminCommand({ aggregate: 1, pipeline: [ { $currentOp: { allUsers: true, idleConnections: true } }, { $group: { _id: { desc: "$desc", ns: "$ns", WaitState: "$WaitState" }, count: { $sum: 1 } } } ], cursor: {} });
위 쿼리는 각 네임스페이스에서 실행되는 모든 쿼리의 집계를 반환합니다. 또한 모든 내부 시스템 작업과 네임스페이스당 고유한 대기 상태 수를 나열합니다.
**참고:**내부 작업의 GARBAGE\ _COLLECTION 지표는 Amazon DocumentDB 클러스터의 다중 버전 동시성 제어(MVCC) 구현입니다. 이는 사용하지 않은 문서 버전을 제거하고 데이터베이스의 업데이트 또는 삭제 횟수와의 상관관계를 지정하는 백그라운드 스위퍼입니다. Amazon DocumentDB는 수집 수준에서 내부 임계값을 기반으로 스위핑 프로세스를 시작하고 결과적으로 읽기/쓰기 IOPS 및 CPU 사용량을 초래합니다.
쿼리의 효율성 확인
쓰기 쿼리에 대한 인덱스 오버헤드 확인
인덱스가 너무 많거나 사용되지 않으면 쓰기 작업이 느려질 수 있습니다. 성능을 개선하려면 인덱스 사용 통계를 확인하여 불필요한 인덱스를 파악하고 제거하십시오.
쿼리 설명 계획 확인
쿼리가 컬렉션의 모든 문서를 검색해야 하는 경우 속도가 느려집니다. 적절한 인덱스를 만들어 쿼리 속도를 높입니다.
explain 명령을 사용하여 인덱스를 만들려는 필드를 파악합니다. 또한 프로파일러 로그를 사용하여 장기 실행 쿼리와 해당 작업의 세부 정보를 캡처할 수도 있습니다.
컬렉션 통계 확인
사용하는 컬렉션에 대한 다음 통계를 확인하십시오.
- 성능 개선 도우미의 상위 쿼리 섹션을 검토하여 로드에 가장 큰 영향을 미치는 컬렉션을 파악합니다.
- 컬렉션의 통계를 검토하여 DocumentDB가 수행하는 삽입, 업데이트 및 삭제 작업의 수를 이해하십시오. 또한 인덱스 스캔과 전체 컬렉션 스캔이 몇 번 발생하는지 확인할 수 있습니다.
- 특히 업데이트 작업 횟수가 많은 경우 컬렉션을 분할하여 처리해야 할 문서 크기를 줄입니다.
과도한 로깅 설정 확인
Amazon DocumentDB는 데이터베이스 트래픽보다 이벤트 감사를 우선시합니다. 감사가 필요하지 않은 경우에는 감사를 끌 수 있습니다. 감사가 필요한 경우 필요한 이벤트만 로깅하도록 audit_logs 파라미터를 설정하십시오. 로드 증가에 대비하고, 필요한 경우 더 큰 인스턴스 클래스로 전환합니다.
프로파일러 로그의 과도한 로깅을 피하려면 profiler_threshold_ms 파라미터에 올바른 값을 설정되어 있는지 확인합니다. 애플리케이션 워크로드를 검토하여 쿼리를 장기 실행으로 분류하는 데 필요한 올바른 임계값을 파악합니다.
CloudWatch로 내보내려는 로그에 대해 로그 내보내기 옵션을 활성화합니다.
모범 사례 사용
읽기 워크로드를 리더로 오프로드
Amazon DocumentDB 클러스터에 다중 DB 인스턴스가 있는 경우 읽기 워크로드를 리더 인스턴스로 오프로드합니다. 복제본 세트로 연결하는 경우 연결의 readPreference를 지정합니다. 읽기 기본 설정을 secondaryPreferred로 지정하면 클라이언트는 읽기 쿼리를 복제본으로 라우팅하려고 합니다. 클라이언트는 쓰기 쿼리를 기본 DB 인스턴스로 라우팅하려고 합니다.
참고: 리더는 최종 일관성을 유지합니다. 워크로드에 보다 강력한 쓰기 후 읽기 일관성이 필요한 경우 동적 읽기 기본 설정을 사용하고 쿼리 수준에서 이를 재정의하십시오. 예를 들어 쿼리가 보조 쿼리로 이동하도록 연결 수준에서 secondaryPreferred로 기본 설정할 수 있습니다. 보다 강력한 쓰기 후 읽기 일관성이 필요한 쿼리가 있는 경우 기본값을 재정의하고 프라이머리 노드에서 읽을 수 있습니다.
예:
db.collection.find().readPref("primary")
클러스터에 하나 이상의 리더 인스턴스 추가
Amazon DocumentDB 클러스터에 단일 DB 인스턴스(라이터 전용)가 있는 경우 클러스터에 하나 이상의 리더 DB 인스턴스를 추가하십시오. 그런 다음 readPreference=SecondaryPreferred 명령을 사용하여 로드를 효율적으로 처리합니다.
Amazon DocumentDB 프로파일러를 사용하여 느린 쿼리 파악
Amazon DocumentDB 프로파일러를 사용하여 느린 쿼리를 기록합니다. 느린 쿼리 로그에 쿼리가 반복적으로 나타나는 경우 성능을 향상시키기 위해 추가 인덱스가 필요할 수 있습니다.
실행 계획에 COLLSCAN 단계가 포함된 장기 실행 쿼리가 있는지 확인하십시오. COLLSCAN 단계는 쿼리에 대한 응답을 제공하기 위해 쿼리가 컬렉션의 모든 문서를 읽어야 함을 의미합니다.
자세한 내용은 Amazon DocumentDB(MongoDB 호환)에서 실행 속도가 느린 쿼리 프로파일링을 참조하십시오.
CloudWatch를 사용하여 경보 알림 만들기
CPU 사용률 지표가 특정 임계값을 초과할 경우 알려주는 CloudWatch 경보를 만듭니다.
DB 인스턴스의 인스턴스 클래스 스케일 업
쿼리 조정 범위가 더 이상 없는 경우 클러스터에 있는 인스턴스의 인스턴스 클래스를 스케일 업하여 워크로드를 처리합니다.
참고: 인스턴스 클래스를 스케일 업하면 비용이 증가합니다. 자세한 내용은 Amazon DocumentDB(MongoDB 호환) 요금을 참조하십시오.
