Amazon S3 성능 지침

Amazon S3 성능 지침

Amazon S3에서 객체를 업로드하고 가져오는 애플리케이션을 만들 때는 모범 사례 지침을 따라 성능을 최적화해요. 더 자세한 내용은 Amazon S3 성능 설계 패턴도 제공돼요.

출처: 문서

본문

Amazon S3에서 애플리케이션의 최상의 성능을 얻으려면 다음 지침을 권장해요.

성능 측정 (Measure performance)

성능을 최적화할 때는 네트워크 처리량, CPU, DRAM 요구 사항을 살펴봐요. 이런 서로 다른 리소스의 요구가 어떻게 섞이는지에 따라 다양한 Amazon EC2 인스턴스 유형을 평가해 볼 만해요. 인스턴스 유형에 대한 자세한 내용은 Amazon EC2 User Guide의 Instance Types를 참고하세요.

성능을 측정할 때 HTTP 분석 도구로 DNS 조회 시간, 지연 시간, 데이터 전송 속도를 살펴보는 것도 도움이 돼요.

애플리케이션의 성능 요구 사항을 이해하고 성능을 최적화하려면 받는 503 오류 응답도 모니터링할 수 있어요. 일부 성능 지표를 모니터링하면 추가 비용이 발생할 수 있어요. 자세한 내용은 Amazon S3 요금을 참고하세요.

503(Slow Down) 상태 오류 응답 수 모니터링

받는 503 상태 오류 응답 수를 모니터링하려면 다음 옵션 중 하나를 사용할 수 있어요.

  • Amazon S3용 Amazon CloudWatch 요청 지표를 사용해요. CloudWatch 요청 지표에는 5xx 상태 응답에 대한 지표가 포함돼요. CloudWatch 요청 지표에 대한 자세한 내용은 Amazon CloudWatch로 지표 모니터링을 참고하세요.
  • Amazon S3 Storage Lens의 고급 지표 섹션에 있는 503(Service Unavailable) 오류 수를 사용해요. 자세한 내용은 성능 개선에 S3 Storage Lens 지표 사용을 참고하세요.
  • Amazon S3 서버 액세스 로깅을 사용해요. 서버 액세스 로깅으로 503(Internal Error) 응답을 받는 모든 요청을 필터링하고 검토할 수 있어요. 로그를 파싱하는 데 Amazon Athena를 사용할 수도 있어요. 서버 액세스 로깅에 대한 자세한 내용은 서버 액세스 로깅으로 요청 로깅을 참고하세요.

HTTP 503 상태 오류 코드 수를 모니터링하면 어떤 접두사, 키 또는 버킷이 가장 많이 제한되는 요청을 받는지에 대한 유용한 통찰을 얻을 수 있는 경우가 많아요.

스토리지 연결을 수평으로 확장 (Scale storage connections horizontally)

요청을 여러 연결에 분산하는 것은 성능을 수평 확장하는 일반적인 설계 패턴이에요. 고성능 애플리케이션을 만들 때 Amazon S3를 전통적인 스토리지 서버 같은 단일 네트워크 엔드포인트가 아니라 매우 큰 분산 시스템으로 생각해요. Amazon S3에 여러 동시 요청을 보내면 최상의 성능을 얻을 수 있어요. 별도의 연결에 이 요청들을 분산해 Amazon S3의 접근 가능한 대역폭을 최대화해요. Amazon S3는 버킷에 대한 연결 수에 제한이 없어요.

바이트 범위 가져오기 사용 (Use byte-range fetches)

GET Object 요청에서 Range HTTP 헤더를 사용하면 객체에서 바이트 범위를 가져와 지정된 부분만 전송할 수 있어요. 같은 객체 안에서 서로 다른 바이트 범위를 가져오도록 Amazon S3에 동시 연결을 사용할 수 있어요. 이렇게 하면 단일 전체 객체 요청보다 더 높은 집계 처리량을 달성할 수 있어요. 큰 객체의 더 작은 범위를 가져오면 요청이 중단되었을 때 애플리케이션의 재시도 시간도 개선할 수 있어요. 자세한 내용은 객체 다운로드를 참고하세요.

객체를 멀티파트 업로드로 PUT했다면 최상의 성능을 위해 같은 파트 크기로(또는 최소한 파트 경계에 맞춰) GET하는 것이 좋은 관행이에요. GET 요청은 개별 파트를 직접 주소 지정할 수 있어요. 예를 들어 GET ?partNumber=N처럼요.

지연 시간에 민감한 애플리케이션의 요청 재시도 (Retry requests for latency-sensitive applications)

적극적인 타임아웃과 재시도는 일관된 지연 시간을 끌어내는 데 도움이 돼요. Amazon S3의 규모가 크기 때문에 첫 번째 요청이 느리면 재시도한 요청은 다른 경로를 택해 빠르게 성공할 가능성이 높아요. AWS SDK에는 특정 애플리케이션의 허용 오차에 맞게 조정할 수 있는 구성 가능한 타임아웃과 재시도 값이 있어요.

Amazon S3(스토리지)와 Amazon EC2(컴퓨팅)를 같은 AWS 리전에 결합 (Combine Amazon S3 (Storage) and Amazon EC2 (compute) in the same AWS Region)

S3 버킷 이름은 전역적으로 고유하지만, 각 버킷은 버킷을 만들 때 선택한 리전에 저장돼요. 버킷 이름 지정 지침에 대한 자세한 내용은 버킷 개요와 버킷 이름 규칙을 참고하세요. 성능을 최적화하려면 가능하면 같은 AWS 리전의 Amazon EC2 인스턴스에서 버킷에 접근할 것을 권장해요. 이렇게 하면 네트워크 지연 시간과 데이터 전송 비용을 줄일 수 있어요.

데이터 전송 비용에 대한 자세한 내용은 Amazon S3 요금을 참고하세요.

거리로 인한 지연 시간을 줄이려면 Amazon S3 Transfer Acceleration 사용 (Use Amazon S3 Transfer Acceleration to minimize latency caused by distance)

Amazon S3 Transfer Acceleration으로 빠르고 안전한 파일 전송 구성은 클라이언트와 S3 버킷 사이의 긴 지리적 거리에서 파일을 빠르고 쉽게, 안전하게 전송해요. Transfer Acceleration은 Amazon CloudFront의 전 세계 분산 에지 위치를 활용해요. 데이터가 에지 위치에 도착하면 최적화된 네트워크 경로를 통해 Amazon S3로 라우팅돼요. Transfer Acceleration은 대륙을 넘어 기가바이트에서 테라바이트 규모의 데이터를 정기적으로 전송할 때 이상적이에요. 또한 전 세계에서 중앙 버킷으로 업로드하는 클라이언트에게도 유용해요.

Amazon S3 Transfer Acceleration 속도 비교 도구를 사용해 Amazon S3 리전에 걸친 가속화/비가속화 업로드 속도를 비교할 수 있어요. 이 속도 비교 도구는 멀티파트 업로드를 사용해 Amazon S3 Transfer Acceleration을 사용할 때와 사용하지 않을 때 브라우저에서 다양한 Amazon S3 리전으로 파일을 전송해요.

AWS SDK 최신 버전 사용 (Use the latest version of the AWS SDKs)

AWS SDK는 Amazon S3 성능 최적화를 위한 권장 지침 중 상당수를 기본 지원해요. SDK는 애플리케이션 안에서 Amazon S3를 활용하기 위한 더 간단한 API를 제공하며, 최신 모범 사례를 따르도록 정기적으로 업데이트돼요. 예를 들어 SDK에는 HTTP 503 오류 발생 시 요청을 자동으로 재시도하는 로직이 포함되어 있고, 느린 연결에 대응하고 적응하는 코드에 투자하고 있어요.

SDK는 또한 수평 확장 연결을 자동화해 초당 수천 건의 요청을 달성하는 Transfer Manager를 제공하며, 적절한 경우 바이트 범위 요청을 사용해요. 최신 성능 최적화 기능을 얻으려면 AWS SDK의 최신 버전을 사용하는 것이 중요해요.

HTTP REST API 요청을 사용할 때도 성능을 최적화할 수 있어요. REST API를 사용할 때는 SDK에 포함된 것과 같은 모범 사례를 따라야 해요. 느린 요청에는 타임아웃과 재시도를 허용하고, 객체 데이터를 병렬로 가져올 수 있도록 여러 연결을 사용해요. REST API 사용에 대한 자세한 내용은 Amazon Simple Storage Service API Reference를 참고하세요.

더 알아보기 (Learn more)