Amazon DynamoDB 프로비저닝된 테이블의 읽기 또는 쓰기 작업이 병목 상태입니다. 또는 프로비저닝된 DynamoDB 테이블에서 읽기 또는 쓰기 작업을 수행할 때 다음 오류가 발생합니다. "ProvisionedThroughputExceededException."
간략한 설명
다음은 DynamoDB 프로비저닝된 테이블에서 병목 현상이 발생할 수 있는 일반적인 시나리오입니다.
- DynamoDB 테이블의 프로비저닝된 용량이 충분하지만 대부분의 요청은 병목 현상이 발생합니다.
- DynamoDB용 AWS 애플리케이션 오토 스케일링을 활성화했지만 DynamoDB 테이블이 병목 현상을 겪고 있습니다.
- 테이블에 핫 파티션이 있습니다.
- 테이블 트래픽이 계정 처리량 할당량을 초과했습니다.
해결 방법
참고: 병목 현상 이벤트 중에 모니터링해야 하는 WriteThrottleEvents 및 ReadThrottleEvents와 같은 DynamoDB 지표에 대한 자세한 내용은 DynamoDB 지표 및 차원을 참조하세요.
사용 사례에 따라 다음 작업을 완료하세요.
DynamoDB 테이블의 프로비저닝된 용량이 충분하지만 대부분의 요청은 병목 현상이 발생합니다
DynamoDB는 분 단위 지표를 Amazon CloudWatch에 보고합니다. 지표는 1분 동안의 합계로 계산한 다음 평균을 구합니다. 하지만 DynamoDB 속도 제한은 초당 적용됩니다. 예를 들어, DynamoDB 테이블에 60개의 쓰기 용량 단위를 프로비저닝한 경우 1분에 3600개의 쓰기를 수행할 수 있습니다. 하지만 나머지 1분 동안 요청 없이 3600개의 요청을 모두 처리하면 병목 현상이 발생할 수 있습니다. 분당 읽기 용량 단위 또는 쓰기 용량 단위의 총 수는 테이블에 할당된 처리량보다 낮을 수 있습니다. 하지만 몇 초 내에 모든 워크로드가 감소하면 요청에 병목 현상이 발생할 수 있습니다.
이 문제를 해결하려면 테이블에 트래픽을 처리할 수 있는 충분한 용량이 있는지 확인하세요. 그런 다음 지수 백오프를 사용하여 병목 현상이 발생한 요청을 재시도합니다. AWS SDK를 사용하는 경우 이 로직이 기본적으로 구현됩니다. 자세한 내용은 오류 재시도 및 지수 백오프를 참조하세요.
참고: DynamoDB는 초당 소비된 용량이 프로비저닝된 용량을 초과한 후에는 테이블 스로틀링을 시작하지 않습니다. DynamoDB는 버스트 용량 기능을 통해 나중에 급증하는 사용량을 처리하기 위해 미사용 용량의 일부를 예약합니다. 자세한 내용은 프로비저닝된 용량 모드 및 Amazon DynamoDB는 짧은 간격으로 급증하는 로드를 어떻게 처리합니까?를 참조하세요
DynamoDB용 AWS 애플리케이션 오토 스케일링을 활성화했지만 DynamoDB 테이블이 병목 현상을 겪고 있습니다
AWS 애플리케이션 Auto Scaling은 DynamoDB 테이블의 갑작스러운 트래픽 급증을 해결하는 데 적합한 솔루션이 아닙니다. Application Auto Scaling은 사용된 용량 단위에 대한 연속된 두 개의 데이터 포인트가 1분 내에 구성된 사용률 값을 초과할 때 확장을 시작합니다. Application Auto Scaling은 사용된 용량이 일정한 2분 동안 목표 사용률보다 높은 경우에만 프로비저닝된 용량을 자동으로 확장합니다.
사용된 용량에 대한 CloudWatch의 연속 데이터 요소 15개가 목표 사용률보다 낮을 때 축소 이벤트가 시작됩니다. 애플리케이션 오토 스케일링이 시작된 후 UpdateTable API 호출이 호출됩니다. DynamoDB 테이블 또는 인덱스의 프로비저닝된 용량을 업데이트하는 데 API 호출이 몇 분 정도 걸릴 수 있습니다. 애플리케이션 Auto Scaling에서는 DynamoDB 테이블의 프로비저닝된 용량을 확장하기 위해 목표 사용률 값이 더 높은 연속적인 데이터 포인트가 필요합니다. 이 기간 동안 테이블의 프로비저닝된 용량을 초과하는 모든 요청에 병목 현상이 발생합니다. 애플리케이션 Auto Scaling을 사용하여 DynamoDB에서 급증하는 워크로드를 처리하는 것은 최선이 아닙니다. 대신 온디맨드 모드로 전환하세요. 자세한 내용은 DynamoDB Auto Scaling을 통한 자동 처리 용량 관리를 참조하십시오.
테이블에 핫 파티션이 있습니다
DynamoDB에서는 카디널리티가 높지 않은 파티션 키는 몇 개의 파티션만을 대상으로 하는 요청이 많을 수 있습니다. 이 이벤트는 핫 파티션을 일으킵니다. 핫 파티션은 초당 3000RCU와 1000WCU(또는 이 둘 모두의 조합)의 파티션 제한을 초과할 경우 전송률 저하를 일으킬 수 있습니다.
테이블에서 가장 많이 액세스되고 병목 현상이 심한 항목을 찾으려면 Amazon CloudWatch Contributor Insights를 사용하세요. Amazon CloudWatch Contributor Insights는 DynamoDB 테이블 트래픽 추세를 요약하여 보여주는 진단 도구입니다. 이 도구를 사용하여 가장 자주 액세스하는 파티션 키를 식별하고 테이블의 항목 액세스 패턴에 대한 그래프를 지속적으로 모니터링할 수 있습니다.
핫 파티션은 테이블의 전체 성능을 저하시킬 수 있습니다. 이러한 성능 저하를 방지하려면 읽기 및 쓰기 작업을 테이블 전체에 최대한 균등하게 분배하세요. 자세한 내용은 워크로드 분산을 위한 파티션 키 설계 및 적합한 DynamoDB 파티션 키 선택을 참조하세요.
또한 단축키에 쓰기 샤딩을 구현하여 카디널리티를 높이고 핫키가 여러 파티션에 분산되도록 할 수 있습니다. 자세한 내용은 쓰기 샤딩을 사용하여 워크로드를 균등하게 분산하는 방법을 참조하세요. 지수 백오프를 사용하여 병목 현상이 발생한 요청을 재시도합니다. AWS SDK를 사용하는 경우 이 로직이 기본적으로 구현됩니다. 자세한 내용은 오류 재시도 및 지수 백오프를 참조하세요.
트래픽이 많을 것으로 예상되면 프로비저닝된 용량을 높은 값으로 늘리는 것이 좋습니다. 프로비저닝된 용량이 증가하면 백엔드의 파티션 수가 늘어납니다.
참고: DynamoDB용 CloudWatch Contributor Insights 도구를 사용하는 경우 추가 요금이 발생합니다. 자세한 내용은 DynamoDB용 CloudWatch Contributor Insights 결제를 참조하세요.
테이블 트래픽이 계정 처리량 할당량을 초과했습니다
어느 AWS 리전에서나 테이블 수준 읽기 처리량 및 테이블 수준 쓰기 처리량 할당량이 계정 수준에서 적용됩니다. 이러한 할당량은 프로비저닝된 용량 모드와 온디맨드 용량 모드가 모두 있는 테이블에 적용됩니다. 기본적으로 테이블의 처리량 할당량은 40,000개의 읽기 요청 유닛과 40,000개의 쓰기 요청 유닛입니다. 테이블로 향하는 트래픽이 이 할당량을 초과하면 테이블이 병목 현상을 일으킬 수 있습니다.
이 문제를 해결하려면 Service Quotas 콘솔을 사용해 계정의 테이블 수준 읽기 또는 쓰기 처리량 할당량을 늘리세요.
관련 정보
파티션 키를 효과적으로 설계하고 사용하기 위한 모범 사례