我正在运行 sync 命令来在我的 EC2 实例和 S3 桶之间传输数据,但传输速度很慢。如何解决此问题?

5 分钟阅读
0

我正在运行 sync 命令来在 Amazon Elastic Compute Cloud(Amazon EC2)实例和 Amazon Simple Storage Service(Amazon S3)桶之间传输数据。但是,传输速度很慢。如何解决此问题?

简短描述

AWS 命令行界面(AWS CLI)上的 sync 命令是一项高级命令,包括 ListObjectsV2、HeadObject、GetObject 和 PutObject API 调用。 如需确定可能导致传输缓慢的原因,请执行下列操作:

  • 查看您的用例的架构。
  • 检查网络连接。
  • 测试上传到 Amazon S3 和从 Amazon S3 下载的速度。
  • 查看当同步作为后台进程运行时的网络和资源负载。

解决方法

查看您的用例的架构

在测试网络连接、传输速度和资源负载之前,请考虑以下可能影响传输速度的架构因素:

  • 您使用的是哪种 Amazon EC2 实例类型? 对于此传输用例,最佳做法是使用吞吐量至少为 10 Gbps 的实例。
  • EC2 实例和 S3 桶是否位于同一 AWS 区域? 最佳做法是在同一区域部署实例和桶。将 Amazon S3 的 VPC 端点连接到部署实例的 VPC 也是最佳实践。
  • 对于位于同一区域的实例和桶,AWS CLI 是否配置为使用 Amazon S3 传输加速端点? 如果资源位于同一区域,则最好不要使用传输加速端点。
  • 您要传输的源数据集的性质是什么? 例如,您是否正在向 Amazon S3 传输大量小文件或一些大文件? 有关使用 AWS CLI 将不同的源数据集传输到 Amazon S3 的详细信息,请参阅充分利用 Amazon S3 CLI
  • 您使用的是哪个版本的 AWS CLI? 确保您使用的是最新版本的 AWS CLI
  • 您的 AWS CLI 配置是什么?

如果在遵循最佳做法后,传输仍然缓慢,请检查网络连接、传输速度和资源负载。

检查网络连接

在 S3 桶上运行 dig 命令,并查看查询时间字段中返回的查询响应时间。在下面的示例中,查询时间0 毫秒

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 区域端点运行 traceroutemtr。以下 mtr 示例中的请求是通过 Amazon S3 的连接到该实例 VPC 的 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.    创建包含 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 命令的开头插入 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

您可以使用这些测试结果作为基准,与用例的实际同步时间进行比较。

查看当同步作为后台进程运行时的网络和资源负载

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 -i tcp:443 | tail -n +2 | wc -l
21

4.    优化单个同步进程后,您可以并行运行多个同步进程。这避免了在高网络带宽可用但仅使用一半网络带宽时进行单进程较慢上传。当您运行并行同步进程时,请以不同前缀为目标,以获得所需吞吐量。

有关详细信息,请参阅将大量数据上传到 Amazon S3 时如何优化性能?


AWS 官方
AWS 官方已更新 2 年前