AWS CLI の s3 cp コマンドのバージョン間の性能差

スポンサーリンク

概要

ちょっと前に、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.341.16.1811.7.34 +r1.16.181 +r
1回目0m42.984s1m22.460s0m1.304s0m1.924s
2回目0m42.746s1m21.148s0m1.262s0m1.726s
3回目0m41.831s1m21.188s0m1.312s0m1.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 するようにすることが効果的

コメント

タイトルとURLをコピーしました