如何提高 Amazon S3 的同步命令传输性能?

上次更新时间:2020 年 7 月 9 日

我使用 AWS 命令行界面 (AWS CLI) 同步命令将数据传输到 Amazon Simple Storage Service (Amazon S3) 上。但是,传输花费很长时间才能完成。如何提高使用同步命令的传输性能?

解决方法

在运行同步命令时,可以尝试通过以下方式缩短传输时间:

注意:同步命令将比较源存储桶和目标存储桶,以确定目标存储桶中缺少哪些源文件,或者相对于与目标存储桶中的文件,源文件经过了哪些修改。然后,同步命令会将新的或更新后的源文件复制到目标存储桶。源存储桶和目标存储桶中的对象数量可能会影响同步命令完成该过程所需的时间。请务必了解传输大小会影响同步时间,也会影响向 Amazon S3 发出的、与该传输操作相关的请求所产生的成本。 

运行多个 AWS CLI 实例

要复制大量数据,您可以运行多个 AWS CLI 实例以并行执行单独的同步操作。例如,您可以为不同的前缀运行并行同步操作:

aws s3 sync s3://source-AWSDOC-EXAMPLE-BUCKET/folder1 s3://destination-AWSDOC-EXAMPLE-BUCKET/folder1             

aws s3 sync s3://source-AWSDOC-EXAMPLE-BUCKET/folder2 s3://destination-AWSDOC-EXAMPLE-BUCKET/folder2

或者,您可以为单独的排除和包含过滤器运行并行同步操作。例如,以下操作按照以数字 0 到 4 开头的键名称和以数字 5 到 9 开头的键名称将文件分开进行同步:

注意:即使使用了排除和包含筛选条件,同步命令仍会检查源存储桶中的所有文件,以确定将哪些源文件复制到目标存储桶。也就是说,如果您有目标为不同键名前缀的多个同步操作,那么每个同步操作都会检查所有源文件。但是,由于存在排除和包含筛选条件,只有筛选条件中包含的文件会复制到目标存储桶。

aws s3 sync s3://source-AWSDOC-EXAMPLE-BUCKET/ s3://destination-AWSDOC-EXAMPLE-BUCKET/ --exclude "*" --include "0*" --include "1*" --include "2*" --include "3*" --include "4*"  

aws s3 sync s3://source-AWSDOC-EXAMPLE-BUCKET/ s3://destination-AWSDOC-EXAMPLE-BUCKET/ --exclude "*" --include "5*" --include "6*" --include "7*" --include "8*" --include "9*"

有关优化工作负载性能的更多信息,请参阅最佳实践设计模式:优化 Amazon S3 性能

修改 max_concurrent_requests 的 AWS CLI 配置值

若要实现提高性能的可能性,您可以修改 max_concurrent_requests 的值。该值用于设置可一次发送至 Amazon S3 的请求数量。默认值为 10,并且您可以将其增加为一个较高的值。但是,请注意以下事项:

  • 运行的线程越多,消耗的计算机资源也越多。您必须确保您的计算机拥有足够的资源来支持您想要的最大并发请求数。
  • 并发请求过多可能会使系统不堪重负,从而可能导致连接超时或减慢系统的响应性。为避免 AWS CLI 出现超时问题,您可以尝试将 --cli-read-timeout 值或 --cli-connect-timeout 值设置为 0。

如果您使用的是 Amazon Elastic Compute Cloud (Amazon EC2),请检查实例配置

如果您使用 EC2 实例运行同步操作,请考虑以下各项:

  • 查看您正在使用的实例类型。大于 m3.xlarge 的实例类型可以提供更好的结果,因为它们的带宽高且拥有针对 Amazon Elastic Block Store (Amazon EBS) 进行优化的网络。
  • 如果实例所处的 AWS 区域与存储桶不同,则考虑使用处于同一个区域中的实例。缩短实例与存储桶之间的地理距离可以降低延迟。
  • 如果实例与源存储桶处于同一个区域,则考虑为 Amazon S3 设置一个 Amazon Virtual Private Cloud (Amazon VPC) 终端节点。VPC 终端节点可帮助提高整体性能。