Wisdom’s Cloud

[AWS] 1. S3 Performance 본문

AWS/Intermediate

[AWS] 1. S3 Performance

지혜로운지혜쓰 2022. 2. 21. 13:32

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

 

AWS CLI S3 Configuration — AWS CLI 1.22.56 Command Reference

Note: You are viewing the documentation for an older major version of the AWS CLI (version 1). AWS CLI version 2, the latest major version of AWS CLI, is now stable and recommended for general use. To view this page for the AWS CLI version 2, click here. F

docs.aws.amazon.com

 

본 실습에서 설정할 구성 값은 위의 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를 사용하지만, 단일 스레드를 사용하기 때문에 다중 스레드를 사용하는 세 번째 명령에 비해 시간이 많이 소요됩니다.