AmazonのS3にファイルをアップロードする際に役立つ,高速化のTipsです
サブコマンドは cp よりも sync の方が良い
cp よりもsyncの方が高速になります.scpの代わりに rsync を使うのと同じ理由です
cd [コピー元ディレクトリ] aws s3 sync . s3:[コピー先]/
awsコマンドを複数同時起動する
公式FAQに「ファイル転送が遅かったら,awsコマンドを複数同時起動せよ」と書いてあります
aws s3 sync には,rsyncのようにファイル名に対するパターンマッチで転送するファイルを選択する機能があります(フィルタリング機能).
この機能を使って
- ファイル名の先頭が"0"で始まるファイルだけを sync
- ファイル名の先頭が"1"で始まるファイルだけを sync
という感じで複数のsyncコマンドを同時に並列起動します
具体的には
aws s3 sync . s3:[コピー先]/ --exclude '*' --include '1*'
aws s3 sync . s3:[コピー先]/ --exclude '*' --include '2*'
という感じで, --exclude "*" で一旦全てのファイルをsync対象外にしてから --include で先頭が1で始まるファイルのみをsync対象にします
オプションは複数回指定できます.例えば,先頭の数字が,偶数と奇数で,2並列でsyncを実行する場合は
aws s3 sync . s3:[コピー先]/ --exclude '*' --include '1*' --include '3*' --include '5*' --include '7*' --include '9*'
と
aws s3 sync . s3:[コピー先]/ --exclude '*' --include '0*' --include '2*' --include '4*' --include '6*' --include '8*'
を実行すれば良いことになります
また念の為,最後に
aws s3 sync . s3:[コピー先]/
を実行しておけば,コピーし忘れのファイルだけを差分コピーできます
動作パラメータをチューニングする
awsの動作パラメータを変更することでさらに高速化が可能です
関連するパラメータは以下の通り
- 同時接続数 (デフォルト値: 10)
- ネットワーク帯域 (デフォルト値:無制限)
aws configure set default.s3.max_concurrent_requrests 20
aws configure set default.s3.max_bandwidth 1000MB/s
原理上は,(同時接続数 * ネットワーク帯域)の帯域が必要になります
基本的に aws s3 コマンドを使うような環境は,メモリやCPUは潤沢に利用できるはずなので,ボトルネックはネットワーク帯域になります.利用可能なネットワーク帯域に応じてこれらパラメータをチューニングしましょう