내용으로 건너뛰기

Amazon DocumentDB 클러스터에서 쿼리 실행 속도가 느린 이유는 무엇입니까?

4분 분량
0

Amazon DocumentDB(MongoDB 호환) 클러스터에서 실행 속도가 느린 쿼리 문제를 해결하여 성능을 개선하고 싶습니다.

해결 방법

다음과 같은 이유로 Amazon DocumentDB 클러스터에서 쿼리가 느리게 실행될 수 있습니다.

  • 하드웨어 용량 부족
  • 워크로드 변경
  • 트래픽 증가
  • 메모리 문제
  • 차선의 쿼리 플랜

워크로드 모니터링

데이터베이스 성능 문제의 근본 원인을 이해하려면 인스턴스가 사용하는 서버 전체 리소스를 모두 확인하십시오. 워크로드를 모니터링하고 쿼리 성능이 최적이었던 시기와 쿼리를 실행하는 데 시간이 오래 걸리기 시작한 시점을 조사하십시오.

Amazon CloudWatch 지표 사용

Amazon DocumentDB의 CloudWatch 지표를 사용하여 클러스터 성능을 분석합니다. 리소스 부족으로 인한 성능 병목 현상을 파악하려면 CPUUtilizationFreeableMemory와 같은 지표를 사용하십시오. 메모리 최적화를 이해하려면 BufferCacheHitRatioLowMemNumOperationsThrottled와 같은 지표를 사용하십시오.

인스턴스의 워크로드를 이해하려면 운영 수준 지표를 모니터링하십시오. DocumentsInserted, DocumentsReturned, DocumentsDeletedTransactionsAborted와 같은 유용한 지표. 자세한 내용은 Amazon DocumentDB(MongoDB 호환) 클러스터에서 지표 모니터링 및 경보 설정을 참조하십시오.

성능 개선 도우미 사용

성능 개선 도우미를 사용하여 대기, 쿼리, 호스트, 데이터베이스 및 애플리케이션별로 분류된 데이터베이스 워크로드를 평가합니다. 카운터세부 쿼리 정보를 캡처하고 데이터베이스 로드에 가장 많이 기여하는 쿼리를 평가합니다. 최대 vCPU 값보다 높은 데이터베이스 로드는 인스턴스 클래스의 스로틀링된 워크로드를 나타냅니다. 쿼리 텍스트를 분석하면 쿼리를 조정하는 데 도움이 됩니다.

프로파일러 로그 사용

Amazon DocumentDB 프로파일러를 사용하여 클러스터에서 수행되는 작업의 실행 시간과 세부 정보를 로깅합니다. 프로파일러를 사용하면 클러스터에서 가장 느린 작업을 모니터링할 수 있습니다. 이를 통해 개별 쿼리 성능과 전체 클러스터 성능을 개선할 수 있습니다.

데이터베이스 메서드 사용

Amazon DocumentDB 인스턴스에서 다음 currentOp() 명령을 정기적으로 실행하여 시간 경과에 따른 시스템 사용량을 모니터링합니다.

db.adminCommand({currentOp: 1, $all: 1});

시스템의 각 네임스페이스에 있는 쿼리 및 작업 수를 계산하려면 다음 명령을 실행합니다.

db.adminCommand({
  aggregate: 1,
  pipeline: [
    {
      $currentOp: {
        allUsers: true,
        idleConnections: true
      }
    },
    {
      $group: {
        _id: {
          desc: "$desc",
          ns: "$ns",
          WaitState: "$WaitState"
        },
        count: {
          $sum: 1
        }
      }
    }
  ],
  cursor: {}
});

명령을 실행한 후 시스템 사용량 결과를 분석하여 시스템의 로드를 이해하고 적절한 조치를 취하십시오.

쿼리 최적화

장기 실행 쿼리를 파악한 후 쿼리를 조정하여 쿼리 성능을 개선하십시오.

올바른 쿼리 플래너 사용

성능을 개선하려면 최적의 인덱스 플랜을 사용하고 운영자를 위한 인덱스 스캔 지원을 켜십시오. Amazon DocumentDB 버전 5.0 이상에서는 플래너 버전 2.0을 사용하여 찾기, 업데이트, 삭제, 찾기 및 수정 명령과 같은 기본 작업을 최적화하는 고급 쿼리 플래너를 활용할 수 있습니다. 최적의 인덱스가 선택되지 않는 특정 쿼리 패턴의 경우, 이 기능은 특정 쿼리 형태에 적합한 인덱스 목록을 지정할 수 있는 플랜 캐시 필터 기능을 지원합니다.

쿼리의 통계 분석

쿼리 성능을 최적화하려면 executionStats를 사용하여 쿼리 실행 방식을 분석하십시오. executionStats는 각 쿼리 단계에서 처리된 문서 수, 각 단계의 실행 시간, 쿼리 플랜 생성 시도 횟수를 제공합니다.

쿼리의 통계를 보려면 다음 명령을 실행합니다.

query.explain("executionStats");

작업 예시:

db.collection.find({}).limit(2).explain("executionStats");

위의 작업 예시는 두 문서를 찾으려고 할 때 쿼리가 어떻게 수행되는지 분석합니다.

반환된 통계를 검토하십시오. 인덱스를 추가하여 전체 컬렉션 스캔을 줄이고 쿼리가 스캔해야 하는 문서 수를 제한할 수 있습니다. 새 인덱스를 테스트하고 성능을 평가하는 것이 가장 좋습니다. 복제 또는 스냅샷 복원 옵션을 사용하여 테스트 환경을 만드십시오.

인스턴스에 비효율적인 인덱스가 있는지 확인

모든 인덱스는 추가 쓰기 지연 시간, CPU 사용량, I/O 작업 및 전체 리소스 스토리지 사용을 유발합니다. 인덱스를 사용하면 쿼리 성능이 향상될 수 있지만 인덱스를 정기적으로 검토하고 사용하지 않는 인덱스를 제거하는 것이 가장 좋습니다.

각 인덱스에 액세스하는 빈도를 분석하려면 다음 예시와 비슷한 명령을 실행하십시오.

db.collection.aggregate([{$indexStats:{}}]).pretty()

인덱스(인덱스 스캔)로 수행한 총 스캔 수를 보려면 다음 명령을 실행하십시오.

db.collection.stats()

이전 쿼리의 수를 인덱스 없이 수행한 스캔 수(컬렉션 스캔)와 비교합니다. 그런 다음 작업에서 컬렉션에 액세스할 때 인덱스를 사용하는 빈도를 분석합니다.

인스턴스의 비활성 커서 닫기

Amazon DocumentDB 인스턴스는 지정된 시간에 열 수 있는 활성 커서에 제한이 있습니다. 이 제한은 사용하는 인스턴스 유형에 따라 결정됩니다. 자세한 내용은 인스턴스 제한을 참조하십시오. CloudWatch를 사용하여 CloudWatch의 DatabaseCursors 지표를 모니터링하여 열려 있는 커서의 수를 검토할 수 있습니다.

열려 있는 커서에 대한 자세한 내용을 보려면 다음 예와 비슷한 명령을 실행하십시오.

db.runCommand("listCursors")

스로틀링을 피하려면 커서를 사용한 후 커서를 닫는 것이 가장 좋습니다. 유휴 커서는 CPU와 메모리를 활용하여 관련 대기열을 모니터링합니다.

관련 정보

성능 및 리소스 사용률 문제 해결

AWS 공식업데이트됨 6달 전