はじめに
GoQSystemではアプリケーションやAPIサーバーの基盤にAWS ECS on Fargateを採用しています。
ECS Task起動時間短縮はインフラ担当として取り組んでいることの一つです。(イメージサイズを下げるの限界。。。)
2022/10/13 AWSブログでzstd圧縮イメージを使用すると起動時間が短縮されると発表したので試してみました。
zstdとは
Zstandardの略でMetaに所属しているYann Colletによって開発された可逆圧縮アルゴリズムです。
Docker builxコマンド
AWSブログにあるコマンドオプションを指定してイメージをビルドしています。
docker buildx build \
--file Dockerfile \
--output type=image,name=$IMAGE_URI:$IMAGE_TAG,oci-mediatypes=true,compression=zstd,compression-level=3,force-compression=true,push=true .
計測について
ECS TaskのStarted at
とCreated at
の「差分 = 起動時間」とします。
通常のDocker buildのイメージとbuildxでzstd圧縮したイメージそれぞれを使用したECS Taskを30個立ち上げて確認しています。(10タスク×3回)
ECS Taskの内容はどちらも同じものです。
aws cli:ECS TaskのStarted at
とCreated at
を確認
aws ecs describe-tasks --tasks $TASK_ARN --cluster $CLUSTER_NAME
※ コンソール画面でも確認できます
タスク構成
php-fpm + Nginxの2コンテナでベースイメージはAlpineです。
本番環境で使用している設定と構成を使用しました。
プラットフォームバージョンは1.4.0、OSはLinux、CPUアーキテクチャーはamd64(x86)を使用しています。
Docker build イメージを使用したECS Task
■ イメージサイズ
- Nginx: 25.53MB
- PHP: 165.31MB
■ ECS Taskサイズ
- CPU: 4
- Memory: 8GB
■ ECS Task起動時間
- 平均: 24.6(秒)
- 最小: 22.0(秒)
- 最大: 36.0(秒)
- 中央値: 24.5(秒)
Docker buildxでzstd圧縮したイメージを使用したECS Task
■ イメージサイズ
- Nginx: 24.42MB
- PHP: 158.43MB
■ ECS Taskサイズ
- CPU: 4
- Memory: 8GB
■ ECS Task起動時間
- 平均: 23.0(秒)
- 最小: 21.0(秒)
- 最大: 27.0(秒)
- 中央値: 23.0(秒)
まとめ
ざっくりな検証ですが通常のDocker Buildのイメージを使用したECS Taskよりもzstd圧縮したイメージを使用したECS Taskの起動時間の方が早い結果になりました。
バラツキなど他のことも考慮すると本来もっともっとN数やパターンを増やしてみなければいけませんが、時間の関係上いずれまたということで。
AWSブログ内にもあるように機械学習やAI、データ分析系ラージサイズイメージに効果的ということなので、元々イメージサイズが大きくない弊社のようなケースでは劇的な改善が見られることはなさそうです。
In our internal testing of zstd compressed container images on AWS Fargate, we have seen up to a 27% reduction in Amazon ECS Task or Kubernetes Pod startup times. The reduction in startup time varies by container image, with the larger container images seeing the greatest improvement. Uses cases like machine learning, artificial intelligence, and data analytics traditionally have large container images. Consequently, these workloads could see the most benefit from adopting zstd compression.
今回は普段使っているCircleCIではなくGitHub Actionsを使用してDocker Imageをbuildし、ECRへpushしました。その中でDocker buildとbuildxの設定方法であったり色々と学べることがありました。この辺りもいずれ公開できればと思います。
最後に
GoQSystemでは一緒に働いてくれる仲間を募集中です!
ご興味がある方は以下リンクよりご確認ください。