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


21

我必须将400G的文件从弹性块存储卷复制到s3桶中...这些大约是30万个文件,大约1Mb

我试过s3cmds3fuse,两个都是真的,真的很慢..对一个完整的一天s3cmd然表示,完成复制,而当我检查了水桶,若无其事(我想,出事了,但至少s3cmd从未抱怨过任何东西)

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

有更好的解决方案吗?

我当然正在运行Linux(ubuntu 12.04)


2
许多基准测试(例如,这一基准测试)已经证明了3个决定吞吐量达到S3的因素:1)文件大小2)并行线程数和3)实例大小。在64到128个1MB对象的并行(同时)上载之间,应该使m1.xlarge拥有的1Gbps上行链路饱和,甚至应使集群计算实例(cc1.4xlarge)的10Gbps上行链路饱和。应该考虑很多脚本(例如,这一脚本或
s3cmd

1
s3-parallel-put成功了!
aseba 2012年

Answers:


20

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

  • 文件大小-较小的文件需要大量的请求和更多的开销,并且传输速度较慢。文件大小的增益(源自EC2时)对于大于256kB的文件可忽略不计。(但是,从远程位置进行的传输具有更高的延迟,往往会持续显示出明显的改善,直到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

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

尽管上面的想法很合乎逻辑(尽管可能没有每个线程的上限),但是找到支持它们的基准相当容易。一个特别详细的可以在这里找到。

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

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

  • 文件大小通常是固定的-我们无法在EC2上将文件连接在一起,也无法在S3上将它们分开(因此,对于小型文件,我们无能为力)。但是,大文件时,我们可以在EC2端分开,然后在S3端重新组装(使用S3的分段上传)。通常,这对于大于100MB的文件是有利的。
  • 并行线程较难满足。最简单的方法归结为为一些现有的上载脚本编写包装,该包装将一次运行多个副本。更好的方法直接使用API​​来完成类似的操作。请记住,关键是并行请求,因此找到几个潜在的脚本并不困难,例如:

8

因此,在大量测试s3-parallel-put之后,该技巧非常出色。如果您需要将大量文件上传到S3,则显然是解决方案。感谢cyberx86的评论。


3
出于好奇,a)上传400GB花了多长时间b)您使用了多少个线程c)您使用了多少实例大小?
cyberx86

1
@ Cyber​​x86我最近在大型Ec2实例上使用了s3-parallel-put。我使用了5个线程,它在10.49小时内复制了288.73 GB。
Gortron


2

我用C#(CopyFasterToS3)编写了一个优化的控制台应用程序来做到这一点。我在EBS vol中使用过,我的情况是它有5个文件夹,其中包含200万个文件,超过20百万个文件。该脚本在不到30分钟的时间内执行。

本文中,我展示了如何与并行函数一起使用递归函数。您可以将其转录成另一种语言。

祝好运!




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.