web-dev-qa-db-ja.com

400Gのファイルをec2エラスティックブロックストアボリュームからs3にコピーする最も速い方法はどれですか。

400Gのファイルをエラスティックブロックストアボリュームからs3バケットにコピーする必要があります...これらは約1Mbの約300kファイルです

私は s3cmds3Fuse を試してみましたが、どちらも本当に遅いです.. s3cmdは1日中実行され、コピーが完了したと言い、バケットをチェックしたところ、何も起こりませんでした(何か問題があったと思いますが、少なくともs3cmdは何も不満を言ったことはありません)

S3Fuseはもう1日稼働しており、コピーしたファイルは10%未満です...

これに対するより良い解決策はありますか?

もちろんLinux(ubuntu 12.04)を実行しています

21
aseba

EC2からS3へのスループットを決定するいくつかの重要な要素があります。

  • ファイルサイズ-ファイルが小さいほど、要求の数が多くなり、オーバーヘッドが大きくなり、転送が遅くなります。 (EC2からの場合の)ファイルサイズによる増加は、256kBより大きいファイルでは無視できます。 (一方、より高いレイテンシのリモートロケーションからの転送では、1 MiBと2 MiBの間までかなりの改善が見られる傾向があります)。
  • 並列スレッドの数-単一のアップロードスレッドは通常、全体的にかなり低い-多くの場合5MiB/s未満スループットは、並行スレッドの数とともに増加し、64スレッドと128スレッドの間でピークになる傾向があります。大きなインスタンスは、より多くの同時スレッドを処理できることに注意してください。
  • インスタンスサイズ- インスタンスの仕様 のとおり、インスタンスのサイズが大きいほど、専用のリソースが増えます。これには、ネットワーク帯域幅(およびI/O全般)の割り当て(およびI/Oの一般的な割り当て)が含まれます。 -ネットワークに接続されています。各カテゴリの一般的な数値は次のとおりです:
    • 非常に高い:理論的:10Gbps = 1250MB /秒。現実的:8.8Gbps = 1100MB/s
    • 高:理論的:1Gbps = 125MB /秒。現実的:750Mbps = 95MB/s
    • 中程度:理論的:250Mbps;現実的:80Mbps = 10MB/s
    • 低:理論的:100Mbps;現実的:10-15Mbps = 1-2MB/s

大量のデータを転送する場合は、スループットの効果的な向上(> 10x)がコストの差(2-3x)よりも大きいため、クラスターコンピューティングインスタンスを使用すると経済的に実用的です。

上記のアイデアはかなり論理的ですが(スレッドごとのキャップはそうではないかもしれませんが)、それらを裏付けるベンチマークを見つけるのは非常に簡単です。特に詳細なものは here です。

1MBオブジェクトの64から128の並列(同時)アップロードを使用すると、m1.xlargeの1Gbpsアップリンクが飽和し、クラスターコンピューティング(cc1.4xlarge)インスタンスの10Gbpsアップリンクも飽和するはずです。

インスタンスのサイズを変更するのはかなり簡単ですが、他の2つの要因は管理が難しい場合があります。

  • ファイルサイズは通常固定されています-EC2でファイルを結合してS3でそれらを分割することはできません(したがって、小さなファイルについてはあまり実行できません)。ただし、大きなファイルは、EC2側で分割してS3側で再構成できます(S3のマルチパートアップロードを使用)。通常、これは100MBより大きいファイルの場合に有利です。
  • 並列スレッドは、対応するのが少し難しいです。最も簡単な方法は、一度に複数のコピーを実行する既存のアップロードスクリプトのラッパーを作成することです。より優れたアプローチでは、APIを直接使用して同様のことを行います。重要なのは並列リクエストであることを念頭に置いて、いくつかの潜在的なスクリプトを見つけることは難しくありません。たとえば:
    • s3cmd-modification -この機能を追加したs3cmdの初期バージョンのフォークですが、数年更新されていません。
    • s3-parallel-put -かなり最近pythonうまく機能するスクリプト
20
cyberx86

だから、たくさんのテストの後 s3-parallel-put はトリックを驚くほどうまくやった。多くのファイルをS3にアップロードする必要がある場合の解決策は明らかです。コメントをありがとう cyberx86 .

8
aseba

http://docs.aws.Amazon.com/cli/latest/topic/s3-config.html に従ってAWS CLI S3設定値を調整します。

以下では、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
Fletcher

これを行うために、C#( CopyFasterToS ​​)で最適化されたコンソールアプリケーションを作成しました。私はEBS volで使用しました。私の場合は、20 GBの量で200万を超えるファイルを含む5つのフォルダーがありました。スクリプトは30分未満で実行されました。

この記事 では、並列で再帰関数を使用する方法を示しました。別の言語に書き起こせます。

幸運を!

2

S3cmdの代わりにs3-cliを使用してみてください。 s3cmdの代わりにそれを使用して、ファイルをs3バケットにアップロードしました。これにより、展開がほぼ17分(21〜4分)速くなりました。

これがリンクです: https://github.com/andrewrk/node-s3-cli

1
Yahya

代わりにs4cmdを試してください。s3cmdよりも本当に高速です。そのアドレス: https://github.com/bloomreach/s4cmd

1
mcsrainbow

s3funnel もあり、非常に古い(2008年)といくつかの未解決のバグのようですが、Amazon自体にはまだリストされています: amzn-lnk

1
math