동기화 명령을 실행하여 EC2 인스턴스와 S3 버킷 간에 데이터를 전송하고 있지만 전송 속도가 느립니다. 이 문제를 해결하려면 어떻게 해야 하나요?

7분 분량
0

동기화 명령을 실행하여 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스와 Amazon Simple Storage Service(S3) 버킷 간에 데이터를 전송하고 있습니다. 그러나 전송이 느립니다. 이 문제를 해결하려면 어떻게 해야 하나요?

간략한 설명

AWS Command Line Interface(AWS CLI)에서 sync 명령은 ListObjectsV2, HeadObject, GetObject 및 PutObject API 호출을 포함하는 상위 수준의 명령입니다. 전송 속도 저하에 영향을 줄 수 있는 요인을 파악하려면 다음을 수행하세요.

  • 사용 사례의 아키텍처를 검토하세요.
  • 네트워크 연결을 확인합니다.
  • Amazon S3에 업로드 및 다운로드 속도를 테스트합니다.
  • 동기화가 백그라운드 프로세스로 실행되는 동안 네트워크 및 리소스 부하를 검토합니다.

해결 방법

사용 사례의 아키텍처 검토

네트워크 연결, 전송 속도 및 리소스 부하를 테스트하기 전에 전송 속도에 영향을 줄 수 있는 다음 아키텍처 요소를 고려하세요.

  • 어떤 Amazon EC2 인스턴스 유형을 사용 중이신가요? 이 전송 사용 사례의 경우 처리량이 최소 10Gbps인 인스턴스를 사용하는 것이 가장 좋습니다.
  • EC2 인스턴스와 S3 버킷이 동일한 AWS 리전에 있나요? 인스턴스와 버킷을 동일한 리전에 배포하는 것이 가장 좋습니다. 또한 인스턴스가 배포된 VPC에 Amazon S3용 VPC 엔드포인트를 연결하는 것이 가장 좋습니다.
  • 동일한 리전에 있는 인스턴스 및 버킷의 경우, AWS CLI가 Amazon S3 Transfer Acceleration 엔드포인트를 사용하도록 구성되어 있나요? 리소스가 동일한 리전에 있는 경우 Transfer Acceleration 엔드포인트를 사용하지 않는 것이 가장 좋습니다.
  • 전송하려는 소스 데이터 세트의 특성은 무엇인가요? 예를 들어, 많은 작은 파일을 전송하나요, 아니면 몇 개의 큰 파일을 Amazon S3로 전송하나요? AWS CLI를 사용하여 다양한 소스 데이터 세트를 Amazon S3로 전송하는 방법에 대한 자세한 내용은 Amazon S3 CLI 최대한 활용하기를 참조하세요.
  • 어떤 버전의 AWS CLI를 사용 중이신가요? 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.
  • AWS CLI의 구성은 무엇인가요?

모범 사례를 따른 후에도 여전히 전송 속도가 느린 경우 네트워크 연결, 전송 속도 및 리소스 부하를 확인하세요.

네트워크 연결 확인

S3 버킷에서 dig 명령을 실행하고 쿼리 시간 필드에 반환된 쿼리 응답 시간을 검토합니다. 다음 예제에서 쿼리 시간0msec입니다.

Bash

$ dig +nocomments +stats +nocmd awsexamplebucket.s3.amazonaws.com

;awsexamplebucket.s3.amazonaws.com. IN	A
awsexamplebucket.s3.amazonaws.com. 2400 IN CNAME	s3-3-w.amazonaws.com.
s3-3-w.amazonaws.com.	2	IN	A	52.218.24.66
;; Query time: 0 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Fri Dec 06 09:30:47 UTC 2019
;; MSG SIZE  rcvd: 87

도메인 이름 시스템(DNS) 확인 쿼리가 IP 주소를 반환하는 데 걸리는 응답 시간이 길면 성능에 영향을 줄 수 있습니다. 쿼리 응답 시간이 길어지면 인스턴스에 대한 DNS 서버를 변경해 보세요. 다른 네트워크 연결 테스트로, 가상 스타일 호스트 이름과 버킷의 S3 리전 엔드포인트에 대해 TCP를 사용하여 traceroute 또는 mtr를 실행합니다. 다음 mtr 예제의 요청은 인스턴스의 VPC에 연결된 Amazon S3용 VPC 엔드포인트를 통해 라우팅됩니다.

Bash

$ mtr -r --tcp --aslookup  --port 443 -c50  awsexamplebucket.s3.eu-west-1.amazonaws.com
Start: 2019-12-06T10:03:30+0000
HOST: ip-172-31-4-38.eu-west-1.co Loss%   Snt   Last   Avg  Best  Wrst StDev
  1. AS???    ???                 100.0    50    0.0   0.0   0.0   0.0   0.0
  2. AS???    ???                 100.0    50    0.0   0.0   0.0   0.0   0.0
  3. AS???    ???                 100.0    50    0.0   0.0   0.0   0.0   0.0
  4. AS???    ???                 100.0    50    0.0   0.0   0.0   0.0   0.0
  5. AS???    ???                 100.0    50    0.0   0.0   0.0   0.0   0.0
  6. AS???    ???                 100.0    50    0.0   0.0   0.0   0.0   0.0
  7. AS16509  s3-eu-west-1-r-w.am 62.0%    50    0.3   0.2   0.2   0.4   0.0

Amazon S3 업로드 및 다운로드 속도 테스트하기

1.    2GB의 콘텐츠가 포함된 테스트 파일 5개를 생성합니다.

Bash

$ seq -w 1 5 | xargs -n1 -P 5 -I % dd if=/dev/urandom of=bigfile.% bs=1024k count=2048

$ ls -l
total 10244
-rw-rw-r-- 1 ec2-user ec2-user 2097152 Nov 8 08:14 bigfile.1
-rw-rw-r-- 1 ec2-user ec2-user 2097152 Nov 8 08:14 bigfile.2
-rw-rw-r-- 1 ec2-user ec2-user 2097152 Nov 8 08:14 bigfile.3
-rw-rw-r-- 1 ec2-user ec2-user 2097152 Nov 8 08:14 bigfile.4
-rw-rw-r-- 1 ec2-user ec2-user 2097152 Nov 8 08:14 bigfile.5

2.    AWS CLI를 사용하여 동기화 명령을 실행하여 5개의 테스트 파일을 업로드합니다. 전송 시간을 가져오려면 동기화 명령의 시작 부분에 time 명령(Linux 설명서에 나와 있음)을 삽입합니다.

참고: 동기화 명령이 진행되는 동안 처리 속도도 기록해 두세요.

Bash

$ time aws s3 sync . s3://awsexamplebucket/test_bigfiles/ --region eu-west-1

Completed 8.0 GiB/10.2 GiB (87.8MiB/s) with 3 file(s) remaining

real 2m14.402s
user 2m6.254s
sys 2m22.314s

이 테스트 결과를 사용 사례의 실제 동기화 시간과 비교할 수 있는 기준선으로 사용할 수 있습니다.

동기화가 백그라운드 프로세스로 실행되는 동안 네트워크 및 리소스 부하 검토하기

1.    동기화 명령의 끝에 **&**를 추가하여 백그라운드에서 명령을 실행합니다.

참고: 스트림 연산자(>)를 추가하여 나중에 검토할 수 있는 텍스트 파일에 출력을 기록할 수도 있습니다.

Bash

$ time aws s3 sync . s3://awsexamplebucket/test_bigfiles/ --region eu-west-1 \
> ~/upload.log &
[1] 4262
$

2.    동기화 명령이 백그라운드에서 실행되는 동안 mpstat 명령(Linux 설명서에 있음)을 실행하여 CPU 사용량을 확인합니다. 다음 예제에서는 4개의 CPU가 사용 중이며 약 20%가 사용되고 있음을 보여줍니다.

Bash

$ mpstat -P ALL 10
Average:     CPU    %usr   %nice    %sys   %iowait   %irq   %soft  %steal  %guest  %gnice  %idle
Average:     all   21.21    0.00   23.12    0.00    0.00    2.91    0.00    0.00    0.00   52.77
Average:       0   21.82    0.00   21.71    0.00    0.00    3.52    0.00    0.00    0.00   52.95
Average:       1   21.32    0.00   23.76    0.00    0.00    2.66    0.00    0.00    0.00   52.26
Average:       2   20.73    0.00   22.76    0.00    0.00    2.64    0.00    0.00    0.00   53.88
Average:       3   21.03    0.00   24.07    0.00    0.00    2.87    0.00    0.00    0.00   52.03

이 경우 CPU가 병목 현상이 아닙니다. 사용률 비율이 90% 이상인 경우 추가 CPU가 있는 인스턴스를 실행해 보세요. top 명령을 실행하여 실행 중인 가장 높은 CPU 사용률을 검토할 수도 있습니다. 먼저 해당 프로세스를 중지한 다음 동기화 명령을 다시 실행해 보세요.

3.    동기화 명령이 백그라운드에서 실행되는 동안 lsof 명령(Linux 설명서 참조)을 실행합니다. 포트 443에서 Amazon S3에 얼마나 많은 TCP 연결이 열려 있는지 확인합니다.

참고: AWS CLI 구성 파일의 사용자 프로필에 대해 max_concurrent_requests가 20으로 설정되어 있으면 최대 20개의 설정된 TCP 연결이 표시될 것으로 예상됩니다.

Bash

$ lsof -i tcp:443
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
aws     4311 ec2-user    3u  IPv4  44652      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:33156->52.218.36.91:https (CLOSE_WAIT)
aws     4311 ec2-user    4u  IPv4  44654      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39240->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user    5u  IPv4  44655      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39242->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user    6u  IPv4  47528      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39244->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user    7u  IPv4  44656      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39246->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user    8u  IPv4  45671      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39248->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   13u  IPv4  46367      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39254->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   14u  IPv4  44657      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39252->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   15u  IPv4  45673      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39250->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   32u  IPv4  47530      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39258->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   33u  IPv4  45676      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39256->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   34u  IPv4  44660      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39266->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   35u  IPv4  45678      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39260->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   36u  IPv4  45679      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39262->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   37u  IPv4  45680      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39268->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   38u  IPv4  45681      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39264->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   39u  IPv4  45683      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39272->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   40u  IPv4  47533      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39270->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   41u  IPv4  44662      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39276->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   42u  IPv4  44661      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39274->52.216.162.179:https (ESTABLISHED)
aws     4311 ec2-user   43u  IPv4  44663      0t0  TCP ip-172-31-4-38.eu-west-1.compute.internal:39278->52.216.162.179:https (ESTABLISHED)

포트 443에 다른 TCP 연결이 표시되면 동기화 명령을 다시 실행하기 전에 해당 연결을 중지해 보세요.

TCP 연결 수를 확인하려면 다음 명령을 실행하세요.

$ lsof -i tcp:443 | tail -n +2 | wc -l
21

4.    단일 동기화 프로세스가 최적화되면 여러 동기화 프로세스를 병렬로 실행할 수 있습니다. 이렇게 하면 높은 네트워크 대역폭을 사용할 수 있지만 네트워크 대역폭의 절반만 사용 중인 경우 단일 프로세스로 인해 업로드 속도가 느려지는 것을 방지할 수 있습니다. 병렬 동기화 프로세스를 실행할 때 원하는 처리량을 얻으려면 서로 다른 접두사를 대상으로 지정하세요.

자세한 내용은 대량의 데이터를 Amazon S3에 업로드할 때 성능을 최적화하려면 어떻게 해야 하나요?를 참조하세요.


AWS 공식
AWS 공식업데이트됨 일 년 전
댓글 없음