Wisdom’s Cloud
[AWS] 1. S3 Performance 본문
AWS CLI S3 구성
- cp, sync, mv 및 rm 명령을 포함하는 aws s3 transfer 명령에는 S3 전송을 제어하는 데 사용할 수 있는 추가 구성 값이 있습니다.
- 이러한 구성 값은 전적으로 선택 사항이며, 성능상의 이유로 또는 aws s3 명령이 실행되는 특정 환경을 고려하여 이러한 값 중 하나를 수정할 수 있습니다.
- 또한 기본 위치가 ~/.aws/config인 AWS Config 파일의 최상위 s3 키에서 설정해야 하며, 모든 S3 구성 값은 최상위 s3 키 아래에 들여쓰기 및 중첩됩니다.
max_concurrent_request
- 최대 동시 요청 수
- 기본값 10
multipart_threshold
- CLI가 개별 파일의 멀티파트 전송에 사용하는 크기 임계값
- 기본값 8MB
multipart_chunksize
- 멀티파트 전송을 사용할 때 CLI가 개별 파일의 멀티파트 전송에 사용하는 청크 크기
- 기본값 8MB
- 최소 업로드 5MB
그 외의 구성 값들
https://docs.aws.amazon.com/cli/latest/topic/s3-config.html
본 실습에서 설정할 구성 값은 위의 3가지이며, aws configure set 명령을 사용하여 아래와 같이 프로그래밍 방식으로 설정할 수 있습니다.
aws configure set default.s3.max_concurrent_requests 1
aws configure set default.s3.multipart_threshold 64MB
aws configure set default.s3.multipart_chunksize 16MB
이렇게 설정하면 "하나의 스레드로 전송하되, 64MB가 넘으면 16MB씩 나눠서 전송"할 수 있게 됩니다.
대용량 파일의 처리량 최적화
# 1개의 스레드를 사용하여 5GB 파일을 S3 버킷에 업로드 합니다. => 1m35s
time aws s3 cp 5GB.file s3://${bucket}/upload1.test
# 2개의 스레드를 사용하여 5GB 파일을 S3 버킷에 업로드 합니다. => 45s
aws configure set default.s3.max_concurrent_requests 2
time aws s3 cp 5GB.file s3://${bucket}/upload2.test
# 10개의 스레드를 사용하여 5GB 파일을 S3 버킷에 업로드 합니다. => 18s
aws configure set default.s3.max_concurrent_requests 10
time aws s3 cp 5GB.file s3://${bucket}/upload3.test
# 20개의 스레드를 사용하여 5GB 파일을 S3 버킷에 업로드 합니다. => 20s
aws configure set default.s3.max_concurrent_requests 20
time aws s3 cp 5GB.file s3://${bucket}/upload4.test
# 20개의 스레드를 사용하여 1GB 파일 5개를 병렬로 S3 버킷에 업로드 합니다. => 11s
# -j 플래그는 실행할 동시 작업 수이므로, 총 100(20X5)개의 스레드가 생성됩니다.
time seq 1 5 | parallel --will-cite -j 5 aws s3 cp 1GB.file s3://${bucket}/parallel/object{}.test
- 10개에서 20개 스레드 사이에서 성능이 향상되지 않은 것을 확인할 수 있습니다. 이것이 바로 AWS CLI의 제한 사항이며, 다른 소프트웨어를 사용하여 스레드 수를 100개로 늘리면 성능이 계속 향상됩니다.
- 큰 개체를 청크로 나누거나 더 작은 파일을 사용하여 워크로드를 병렬화할 수 있지만, 각 PUT에 1,000개 요청당 $0.05가 청구됩니다. 따라서 5GB 파일을 16MB 청크로 나누면 1 PUT 대신 313 PUT이 되기 때문에 속도가 증가함에 따라 비용도 증가함을 염두에 두어야 합니다.
sync 명령 최적화
# 1개의 스레드를 사용하여 1MB 파일 2000개를 S3 버킷에 업로드 합니다. => 3m32s
aws configure set default.s3.max_concurrent_requests 1
time aws s3 sync /ebs/tutorial/data-1m/ s3://${bucket}/sync1/
# 10개의 스레드를 사용하여 1MB 파일 2000개를 S3 버킷에 업로드 합니다. => 23s
aws configure set default.s3.max_concurrent_requests 10
time aws s3 sync /ebs/tutorial/data-1m/ s3://${bucket}/sync2/
소규모 파일 작업 최적화
# 1개의 스레드를 사용하여 1KB 파일 500개를 S3 버킷에 업로드 합니다. => 4m19s
time parallel --will-cite -a object_ids -j 1 aws s3 cp 1KB.file s3://${bucket}/run1/{}
# 10개의 스레드를 사용하여 1KB 파일 500개를 S3 버킷에 업로드 합니다. => 27s
time parallel --will-cite -a object_ids -j 10 aws s3 cp 1KB.file s3://${bucket}/run2/{}
# 50개의 스레드를 사용하여 1KB 파일 500개를 S3 버킷에 업로드 합니다. => 21s
time parallel --will-cite -a object_ids -j 50 aws s3 cp 1KB.file s3://${bucket}/run3/{}
# 100개의 스레드를 사용하여 1KB 파일 500개를 S3 버킷에 업로드 합니다. => 22s
time parallel --will-cite -a object_ids -j 100 aws s3 cp 1KB.file s3://${bucket}/run4/{}
- 50개에서 100개 스레드로 이동해도 성능이 향상되지 않을 수 있습니다. 따라서 CPU 부족과 같은 또 다른 병목 현상이 발생할 때까지 스레드를 추가할 수록 성능이 향상된다고 가정하면 됩니다.
다른 위치에 객체 복사 최적화
# 5GB 파일을 다운로드한 후 다른 위치에 업로드 합니다. => 38s
time (aws s3 cp s3://$bucket/upload1.test 5GB.file; aws s3 cp 5GB.file s3://$bucket/copy/5GB.file)
# PUT COPY를 사용하여 5GB 파일을 다른 위치에 업로드 합니다. => 2m
time aws s3api copy-object --copy-source $bucket/upload1.test --bucket $bucket --key copy/5GB-2.file
# 단일 명령을 사용하여 5GB 파일을 다른 위치에 업로드 합니다. => 16s
time aws s3 cp s3://$bucket/upload1.test s3://$bucket/copy/5GB-3.file
- 첫 번째 명령은 S3에서 EC2 인스턴스로 데이터를 가져온 다음 EC2 인스턴스에서 S3로 데이터를 다시 PUT 하기 때문에 PUT COPY를 사용하는 세 번째 명령에 비해 2배의 시간이 소요됩니다.
- 두 번째 명령도 PUT COPY를 사용하지만, 단일 스레드를 사용하기 때문에 다중 스레드를 사용하는 세 번째 명령에 비해 시간이 많이 소요됩니다.
'AWS > Intermediate' 카테고리의 다른 글
[AWS] 6. EC2 인스턴스의 EBS 볼륨 확장 (0) | 2022.03.04 |
---|---|
[AWS] 5. Terraform을 사용하여 VPC 리소스 생성 (0) | 2022.02.24 |
[AWS] 4. S3 권한 관리 (퍼블릭 액세스 차단 / 버킷 정책 / ACL) (0) | 2022.02.23 |
[AWS] 3. Analytic Services (0) | 2022.02.23 |
[AWS] 2. Database Services (0) | 2022.02.23 |