概要
ちょっと前に、2019/06/24 に S3 署名バージョン2が廃止になるという話があり、某システムの要件として AWS CLI のバージョンを上げなくてはいけないという状態になっていました。
バージョンを上げること自体は簡単なことなのですが、、、、上げてみたらビックリ!!全然性能が出ません!!
そこで、改めて簡単な性能検査を行なった結果が以降の話となります。
ちなみに、、、結局 S3 署名バージョン2廃止
自体は土壇場になって AWS によって方針転換されたので、対応は不要となったのでした(/_\*)
比較条件
今回比較を行なった条件は下記の通りです。
- AWS CLI は下記の2つのバージョンで比較
- 1.7.34
- 1.16.181
--recursive
指定の有無で比較
下記は共通条件
- Python-2.7.10
- OS は Amazonlinux の同じバージョン
これらの条件下で、数KB程度の小さなファイルを100 個程度 aws s3 cp コマンドにより、EC2 上から S3 上にコピーする時間を計測しました。--recursive
を指定する際には全ファイルを対象に一括コピー、指定しない場合には、単純に for 文で1ファイルずつコピーとしました。
検証結果
計測は time コマンドで実施。
数値は real を採用。+r
がついているものは --recursive
オプション付きです。
1.7.34 | 1.16.181 | 1.7.34 +r | 1.16.181 +r | |
1回目 | 0m42.984s | 1m22.460s | 0m1.304s | 0m1.924s |
2回目 | 0m42.746s | 1m21.148s | 0m1.262s | 0m1.726s |
3回目 | 0m41.831s | 1m21.188s | 0m1.312s | 0m1.707s |
考察
- 驚くべきことに、1.7.34 から 1.16.181 にバージョンアップした場合、単発の cp の性能は約半分となる
- 同じバージョンで
--recursive
の有無で比較した場合、--recursive
を付けた方が数10倍程度のレベルで性能が高い。コピーするファイル数をもっと増やせば、もっと倍率が増える可能性もあり --recursive
付きの場合も 1.7.34 の方が性能は高い
つまり、これはあくまでも推測レベルですが、実際のファイル転送が始まるまでの始動時の処理が 1.7.34 と比較すると 1.16.181 では2倍程度時間がかかるようになり、それがこのような結果として表れたのではないかと思われます。
あと、--recursive
の効果は絶大ですね。--recursive
指定により並列でファイル転送されるようになりますが、この並列処理が恐ろしく効果的です。
おそらく、max_concurrent_requests
を調整すればさらに性能向上が見込めると思います。
結論
- AWS CLI の s3 cp コマンド(mv コマンドも同様)はバージョンにより2倍程度変わることがあるので、バージョンアップする場合には性能面では注意が必要。バージョンアップすることで性能が大幅に低下することがある
--recursive
による並列処理の効果は絶大なので、少しでも性能が気になるのであれば、なるべく--recursive
指定でまとめて cp するようにすることが効果的
コメント