将 400G 文件从 ec2 弹性块存储卷复制到 s3 的最快方法是什么?

将 400G 文件从 ec2 弹性块存储卷复制到 s3 的最快方法是什么?

我必须将 400G 的文件从弹性块存储卷复制到 s3 存储桶...这些文件大约有 300k 个,大小约为 1Mb

我试过了s3命令s3fuse,它们两个都非常非常慢.. s3cmd 运行了整整一天,说它完成了复制,当我检查存储桶时,什么也没有发生(我想出了什么问题,但至少 s3cmd 从来没有抱怨任何事情)

S3Fuse 又工作了整整一天,复制了不到 10% 的文件...

有没有更好的解决办法?

我当然运行的是 Linux(ubuntu 12.04)

答案1

有几个关键因素决定从 EC2 到 S3 的吞吐量:

  • 文件大小 - 较小的文件需要更多的请求和更多的开销,传输速度较慢。对于大于 256kB 的文件,文件大小的增益(源自 EC2 时)可以忽略不计。(而从远程位置传输时,延迟较高,往往会持续显示明显的改进,直到 1MiB 到 2MiB 之间)。
  • 并行线程数 - 单个上传线程的吞吐量通常相当低 - 通常低于 5MiB/s。吞吐量随着并发线程数的增加而增加,并且往往在 64 到 128 个线程之间达到峰值。应该注意的是,较大的实例能够处理更多的并发线程。
  • 实例大小 - 根据实例规格,更大的实例具有更多专用资源,包括更大(且更少变化)的网络带宽分配(以及一般的 I/O - 包括从临时/EBS 磁盘读取 - 这些都是网络连接的)。每个类别的典型数值为:
    • 非常高:理论上:10Gbps = 1250MB/s;实际:8.8Gbps = 1100MB/s
    • 高:理论值:1Gbps = 125MB/s;实际值:750Mbps = 95MB/s
    • 中等:理论:250Mbps;实际:80Mbps = 10MB/s
    • 低:理论:100Mbps;实际:10-15Mbps = 1-2MB/s

在传输大量数据的情况下,使用集群计算实例可能在经济上是可行的,因为吞吐量的有效增益(>10 倍)大于成本的差异(2-3 倍)。

虽然上述想法相当合乎逻辑(尽管每个线程的上限可能不是),但很容易找到支持这些想法的基准。可以找到一个特别详细的基准这里

使用 64 到 128 个并行(同时)上传 1MB 对象应该会饱和 m1.xlarge 的 1Gbps 上行链路,甚至会饱和集群计算(cc1.4xlarge)实例的 10Gbps 上行链路。

虽然改变实例大小相当容易,但其他两个因素可能更难管理。

  • 文件大小通常是固定的 - 我们不能在 EC2 上将文件合并,然后在 S3 上将它们拆分(因此,对于小文件我们无能为力)。但是,对于大文件,我们可以在 EC2 端拆分,然后在 S3 端重新组合(使用 S3 的多部分上传)。通常,这对于大于 100MB 的文件来说是有利的。
  • 并行线程有点难以满足。最简单的方法是编写一个包装器来处理一些现有的上传脚本,该脚本将同时运行多个副本。更好的方法是直接使用 API 来完成类似的事情。请记住,关键是并行请求,因此不难找到几个潜在的脚本,例如:
    • s3cmd-修改- s3cmd 早期版本的一个分支,添加了此功能,但已经好几年没有更新了。
    • s3-并行-put- 相当新的 python 脚本,运行良好

答案2

经过大量测试后s3-并行-put效果非常好。如果你需要上传大量文件到 S3,这显然是解决方案。感谢cyberx86评论。

答案3

根据以下条件调整 AWS CLI S3 配置值http://docs.aws.amazon.com/cli/latest/topic/s3-config.html

下面将 S3 同步速度提高了至少 8 倍!

例子:

$ more ~/.aws/config
[default]
aws_access_key_id=foo
aws_secret_access_key=bar
s3 =
   max_concurrent_requests = 100
   max_queue_size = 30000

答案4

还有:s3漏斗,它看起来很旧(2008 年)并且存在一些未解决的错误,但亚马逊本身仍然列出它:amzn-lnk

相关内容