메뉴
Amazon Simple Storage Service
개발자 안내서 (API Version 2006-03-01)

요청 빈도 및 성능 고려 사항

이번 주제에서는 요청 빈도에 따라 성능을 최적화할 수 있는 Amazon S3 모범 사례에 대해서 설명합니다. Amazon S3 버킷에서의 워크로드가 일상적으로 초당 100개 PUT/LIST/DELETE 요청을 초과하거나 초당 300개 GET 요청을 초과하는 경우 이 주제의 지침을 따라 최고의 성능과 확장성을 유지하십시오. 

Amazon S3는 매우 높은 요청 빈도를 지원하기 위해 확장됩니다. 요청 빈도가 점차 증가하는 경우 Amazon S3에서 더 높은 요청 빈도를 지원하기 위해 필요에 따라 버킷을 자동으로 분할합니다. 그러나 버킷에서의 요청 빈도가 초당 300개 PUT/LIST/DELETE 요청 또는 초당 800개 GET 요청 이상으로 빠르게 증가할 것으로 예상되는 경우에는 해당 워크로드에 대비하고 요청 빈도가 일시적으로 제한되는 것을 방지하기 위해 지원 사례를 개설하는 것이 좋습니다. 지원 사례를 개설하려면 문의처를 참조하십시오.

참고

이번 주제의 Amazon S3 모범 사례 지침은 일상적으로 초당 100개 이상의 요청을 처리하는 경우에 한해 적용됩니다. 일반적인 워크로드에서 가끔씩만 요청이 초당 100개 발생하고 보통은 초당 800개 미만으로 발생하는 경우에는 이번 지침을 따를 필요가 없습니다.

Amazon S3의 워크로드에서 서버 측 암호화와 함께 AWS Key Management Service(SSE-KMS)가 사용되는 경우 사용 사례에 지원되는 요청 빈도에 대한 자세한 정보는 AWS Key Management Service Developer Guide제한을 참조하십시오.

이번 주제의 Amazon S3 모범 사례 지침은 다음과 같이 두 가지 유형의 워크로드를 기반으로 합니다.

  • 다양한 요청 유형을 포함하는 워크로드 - 요청에서 일반적으로 GET, PUT, DELETE 또는 GET Bucket(객체 나열)을 혼합하여 사용하는 경우 객체에 적절한 키 이름을 선택하면 Amazon S3 인덱스에 대해 지연 시간이 짧은 액세스가 제공되어 성능이 향상됩니다. 초당 보내는 요청 수에 상관없이 확장성도 보장됩니다.

  • GET이 많이 사용되는 워크로드 - 워크로드 대부분이 GET 요청으로 구성되는 경우 Amazon CloudFront 콘텐츠 전송 서비스를 사용하는 것이 좋습니다.

다양한 요청 유형을 포함하는 워크로드

객체를 대량으로 업로드할 때 고객은 때때로 일련 번호나 날짜 및 시간 값을 키 이름의 일부로 사용합니다. 예를 들어, 접두사에 타임스탬프가 포함된 다음 예제에서 볼 수 있듯이 날짜 및 시간 조합을 사용하는 키 이름을 선택할 수 있습니다.

Copy
examplebucket/2013-26-05-15-00-00/cust1234234/photo1.jpg examplebucket/2013-26-05-15-00-00/cust3857422/photo2.jpg examplebucket/2013-26-05-15-00-00/cust1248473/photo2.jpg examplebucket/2013-26-05-15-00-00/cust8474937/photo2.jpg examplebucket/2013-26-05-15-00-00/cust1248473/photo3.jpg ... examplebucket/2013-26-05-15-00-01/cust1248473/photo4.jpg examplebucket/2013-26-05-15-00-01/cust1248473/photo5.jpg examplebucket/2013-26-05-15-00-01/cust1248473/photo6.jpg examplebucket/2013-26-05-15-00-01/cust1248473/photo7.jpg ...

키 이름의 시퀀스 패턴으로 인해 성능 문제가 발생합니다. 이 문제를 이해하기 위해 Amazon S3에서 키 이름을 저장하는 방법을 살펴보겠습니다.

Amazon S3에서는 각 AWS 리전에 객체 키 이름의 인덱스를 유지합니다. 객체 키는 인덱스의 여러 파티션에서 UTF-8 이진 순서대로 저장됩니다. 키 이름은 키가 저장된 파티션을 나타냅니다. 타임스탬프 또는 알파벳 순서와 같은 순차적 접두사를 사용하면 Amazon S3에서 많은 키에 대해 특정 파티션을 대상으로 삼을 확률이 증가하여 파티션의 I/O 용량이 모자라게 됩니다. 키 이름 접두사에 임의성을 추가하면 키 이름과 이에 따라 I/O 로드도 둘 이상의 파티션에 분산됩니다.

워크로드가 일관되게 초당 100개 요청을 초과할 것으로 예상되는 경우 순차적 키 이름을 사용하지 말아야 합니다. 키 이름에 일련 번호나 날짜 및 시간 패턴을 사용해야 하는 경우에는 키 이름에 임의의 접두사를 추가하십시오. 접두사에 임의성을 추가하면 키 이름이 여러 인덱스 파티션에 보다 균등하게 분산됩니다. 임의성을 추가하는 예제는 이 주제의 뒷부분에 제공되어 있습니다.

참고

다음 단원에서 키 이름 접두사에 대해 제공된 지침은 버킷 이름에도 적용됩니다. Amazon S3에서 인덱스에 키 이름을 저장할 때는 버킷 이름이 키 이름의 일부로 저장됩니다(예: examplebucket/object.jpg).

예제 1: 키 이름에 16진수 해시 접두사 추가

키 이름에 임의성을 추가하는 한 가지 방법은 키 이름에 해시 문자열을 접두사로 추가하는 것입니다. 예를 들어, 키 이름으로 할당하려는 문자 시퀀스의 MD5 해시를 계산할 수 있습니다. 해시에서 특정 수의 문자를 선택하고 이를 키 이름에 접두사로 추가합니다. 다음 예제에서는 4자 해시가 포함된 키 이름을 보여 줍니다.

참고

3자~4자의 해시된 접두사를 사용하면 충분합니다. 16진수 해시를 접두사로 사용하는 것이 좋습니다.

Copy
examplebucket/232a-2013-26-05-15-00-00/cust1234234/photo1.jpg examplebucket/7b54-2013-26-05-15-00-00/cust3857422/photo2.jpg examplebucket/921c-2013-26-05-15-00-00/cust1248473/photo2.jpg examplebucket/ba65-2013-26-05-15-00-00/cust8474937/photo2.jpg examplebucket/8761-2013-26-05-15-00-00/cust1248473/photo3.jpg examplebucket/2e4f-2013-26-05-15-00-01/cust1248473/photo4.jpg examplebucket/9810-2013-26-05-15-00-01/cust1248473/photo5.jpg examplebucket/7e34-2013-26-05-15-00-01/cust1248473/photo6.jpg examplebucket/c34a-2013-26-05-15-00-01/cust1248473/photo7.jpg ...

이 임의성으로 인해 몇 가지 흥미로운 문제가 발생합니다. Amazon S3에서는 UTF-8 이진 순서로 된 키 이름 목록을 반환하는 GET Bucket (List Objects) 작업을 제공합니다. 그 부작용은 다음과 같습니다.

  • 그러나 해시된 접두사 때문에 목록이 임의로 정렬된 것처럼 보입니다.

  • 키 이름에 특정 날짜가 포함된 객체 키를 나열하려는 경우 문제가 복잡해집니다. 이전 예제에서는 4자리 16진수 해시를 사용하므로 65536가지 문자 조합(4자 접두사, 각 문자는 16진수 문자 0~f 중 어느 것이든 될 수 있음)이 가능합니다. 따라서 각각 4자 해시 및 날짜의 조합인 특정 접두사가 포함된 65536개의 List Bucket 요청을 보내게 됩니다. 예를 들어, 키 이름에 2013-26-05가 포함된 모든 키를 찾으려고 한다고 가정해 보겠습니다. 이 경우 [0-f][0-f][0-f][0-f]2013-26-05와 같은 접두사가 포함된 List Bucket 요청을 보냅니다.

키 이름에서 해시 문자열 앞에 접두사를 더 추가하여 객체를 그룹화할 수도 있습니다. 다음 예제에서는 키 이름에 animations/videos/ 접두사를 추가합니다.

Copy
examplebucket/animations/232a-2013-26-05-15-00-00/cust1234234/animation1.obj examplebucket/animations/7b54-2013-26-05-15-00-00/cust3857422/animation2.obj examplebucket/animations/921c-2013-26-05-15-00-00/cust1248473/animation3.obj examplebucket/videos/ba65-2013-26-05-15-00-00/cust8474937/video2.mpg examplebucket/videos/8761-2013-26-05-15-00-00/cust1248473/video3.mpg examplebucket/videos/2e4f-2013-26-05-15-00-01/cust1248473/video4.mpg examplebucket/videos/9810-2013-26-05-15-00-01/cust1248473/video5.mpg examplebucket/videos/7e34-2013-26-05-15-00-01/cust1248473/video6.mpg examplebucket/videos/c34a-2013-26-05-15-00-01/cust1248473/video7.mpg ...

이 경우 GET Bucket(객체 나열) 작업에 의해 반환되는 정렬된 목록이 접두사 animationsvideos를 기준으로 그룹화됩니다.

참고

여기서도 객체를 그룹화하기 위해 추가하는 접두사에 시퀀스가 있으면 안 됩니다. 시퀀스가 있을 경우 또 다시 단일 인덱스 파티션이 모자라게 됩니다.

예제 2: 키 이름 문자열 뒤집기

애플리케이션에서 객체를 업로드하는데 이 객체의 키 이름에 대한 접두사에 증가하는 애플리케이션 ID 시퀀스가 포함되어 있다고 가정해 보겠습니다.

Copy
examplebucket/2134857/data/start.png examplebucket/2134857/data/resource.rsrc examplebucket/2134857/data/results.txt examplebucket/2134858/data/start.png examplebucket/2134858/data/resource.rsrc examplebucket/2134858/data/results.txt examplebucket/2134859/data/start.png examplebucket/2134859/data/resource.rsrc examplebucket/2134859/data/results.txt

이 키 이름 지정 체계에서는 쓰기 작업으로 인해 단일 인덱스 파티션이 모자라게 됩니다. 그러나 애플리케이션 ID 문자열을 뒤집으면 임의의 접두사가 지정된 키 이름이 생성됩니다.

Copy
examplebucket/7584312/data/start.png examplebucket/7584312/data/resource.rsrc examplebucket/7584312/data/results.txt examplebucket/8584312/data/start.png examplebucket/8584312/data/resource.rsrc examplebucket/8584312/data/results.txt examplebucket/9584312/data/start.png examplebucket/9584312/data/resource.rsrc examplebucket/9584312/data/results.txt

키 이름 문자열을 뒤집으면 Amazon S3에서 키 이름의 각 고유한 첫 문자에 대해 하나씩 다음 파티션을 시작할 기반이 마련됩니다. examplebucket은 애플리케이션 데이터를 업로드하는 버킷의 이름을 가리킵니다.

Copy
examplebucket/7 examplebucket/8 examplebucket/9

이 예제에서는 Amazon S3에서 키 이름의 첫 문자를 분할에 사용할 수 있는 방법을 보여 주지만 매우 큰 워크로드(초당 2000개 요청 초과 또는 수십억 개의 객체를 포함하는 버킷)의 경우 Amazon S3에서는 분할 체계에 더 많은 문자를 사용할 수 있습니다. Amazon S3에서는 시간이 지나면서 키 수 및 요청 빈도가 증가함에 따라 자동으로 이러한 파티션을 더 분할할 수 있습니다.

GET이 많이 사용되는 워크로드

워크로드에서 주로 GET 요청을 보내는 경우 이전 지침에 더해 Amazon CloudFront 사용도 고려해야 성능을 최적화할 수 있습니다.

Amazon CloudFront를 Amazon S3와 통합하면 짧은 지연 시간 및 높은 데이터 전송 속도로 콘텐츠를 사용자에게 배포할 수 있습니다. 또한 Amazon S3로 보내는 직접 요청 수가 줄어들어 비용이 절감됩니다.

예를 들어, 매우 자주 사용되는 몇몇 객체가 있다고 가정해 보겠습니다. Amazon CloudFront에서는 이러한 객체를 Amazon S3에서 가져와 캐시합니다. 그러면 Amazon CloudFront에서 객체에 대한 향후 요청을 해당 캐시에서 처리할 수 있어 Amazon S3로 보내는 GET 요청의 수가 줄어듭니다. 자세한 내용은 Amazon CloudFront 제품 세부 정보 페이지를 참조하십시오.