跳至內容

執行 sync 命令時,如何加快 EC2 執行個體與 S3 儲存貯體之間的資料傳輸速度?

5 分的閱讀內容
0

我正在執行 sync 命令,在 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體與 Amazon Simple Storage Service (Amazon S3) 儲存貯體之間傳輸資料。但是,傳輸速度緩慢。

簡短說明

AWS Command Line Interface (AWS CLI) 中的 sync 命令屬於高階命令,其中包含 ListObjectsV2、HeadObject、GetObject 和 PutObject API 呼叫。使用以下各節找出傳輸速度緩慢的原因。

解決方法

注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱疑難排解 AWS CLI 錯誤。此外,請確認您使用的是最新 AWS CLI 版本。

檢閱使用案例的架構

測試網路連線、傳輸速度和資源負載之前,請考量以下可能影響傳輸速度的架構因素:

  • 您使用哪一種 Amazon EC2 執行個體類型? 對於此傳輸使用案例,最佳實務是使用輸送量至少為 10 Gbps 的執行個體。
  • EC2 執行個體和 S3 儲存貯體是否位於相同的 AWS 區域? 最佳實務是將執行個體和儲存貯體部署在相同區域。另一項最佳實務是將適用於 Amazon S3 的 VPC 端點連接至部署執行個體的 VPC。
  • 對於位於相同區域的執行個體和儲存貯體,AWS CLI 是否設定為使用 Amazon S3 Transfer Acceleration 端點? 如果資源位於相同區域,最佳實務是不要使用 Transfer Acceleration 端點。
  • 您要傳輸的來源資料集具有哪些特性? 例如,您要將大量小型檔案或少量大型檔案傳輸至 Amazon S3? 如需使用 AWS CLI 將不同來源資料集傳輸至 Amazon S3 的詳細資訊,請參閱充分運用 Amazon S3 CLI。
  • 您的 AWS CLI 組態為何?

如果遵循最佳實務後傳輸速度仍然緩慢,請檢查網路連線、傳輸速度和資源負載。

檢查網路連線

對 S3 儲存貯體執行 dig 命令,然後檢閱 Query time (查詢時間) 欄位傳回的查詢回應時間。在以下範例中,Query time 為 0 msec:

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 伺服器。另一種網路連線測試是使用 TCP,對儲存貯體的虛擬樣式主機名稱和 S3 區域端點執行 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 及從 Amazon S3 下載的速度

  1. 建立 5 個各含 2 GB 內容的測試檔案:

    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 執行 sync 命令,上傳這 5 個測試檔案。若要取得傳輸時間,請在 sync 命令開頭插入 time 命令 (來自 Linux 文件):

    注意: sync 命令執行時,也請務必記下輸送量速度。

    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
    

    您可以將這些測試結果作為基準,與使用案例實際執行 sync 所需的時間進行比較。

sync 在背景執行時檢閱網路和資源負載

  1. 在 sync 命令結尾附加 &,使命令在背景執行:

    注意: 您也可以附加串流運算子 (>),將輸出寫入文字檔案,以供稍後檢閱。

    Bash
    
    time aws s3 sync . s3://awsexamplebucket/test_bigfiles/ --region eu-west-1 \
    > ~/upload.log &
    [1] 4262
    
    
  2. sync 命令在背景執行時,執行 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 使用率。請先停止這些處理程序,然後再次執行 sync 命令。

  3. sync 命令在背景執行時,執行 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 連線,請先停止這些連線,再次執行 sync 命令。

    若要取得 TCP 連線數量,請執行 lsof 命令:

    lsof -i tcp:443 | tail -n +2 | wc -l
    21
    
  4. 最佳化單一 sync 處理程序後,您可以並行執行多個 sync 處理程序。當網路頻寬充足但僅使用一半時,此方法可避免單一處理程序造成上傳速度較慢。並行執行 sync 處理程序時,請以不同前綴為目標,以取得所需的輸送量。

如需更多資訊,請參閱將大量資料上傳至 Amazon S3 時,如何最佳化效能?

AWS 官方已更新 6 個月前