概要
AWS Fargate の起動が遅くてつらいことが多く、イメージサイズを減らせば速くなるんだろうか、ということを調べてみた。
結果
「起動時間」には以下の構成要素が含まれていると推測する。
- ENI の Allocate (10秒程度)
- コンテナイメージの Pull (かかる時間のほとんど)
- コンテナの起動(Firecrackerの起動?)
- IAM 関連の処理
AWS のネットワークはだいたいリソースサイズによってパフォーマンスが設定されているものがほとんどなので、Fargate も同様であると考えられる。
そのため、リソースが大きければそのぶんイメージの Pull にかかる時間は短縮されると考えられる。
Fargate のネットワークの性能については、計測された記事があった。
今回、各10回ほど繰替えし計測を行なったが、起動時間の変化はほとんどなかったため、イメージはキャッシュされていないと思われる。
イメージサイズによる起動時間の比較
以下の図は vCPU 0.25, 512 MB RAM のときに、各イメージサイズの起動時間をプロットしたもの。
vCPU による起動時間の比較
以下の図は、イメージサイズが1024MBのとき、起動時間が vCPU によって変化するのかをプロットしたもの。
計測環境
Base Image
busybox:latest をベースにした。
FROM busybox
ARG PAD=0
RUN dd if=/dev/urandom of=/padding bs=1M count=$PAD
$ for i in 0 16 32 64 128 256 512 1024 \
do \
docker build -t ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/fargate-test:s$i . --build-arg PAD=$i \
done
$ for i in 0 16 32 64 128 256 512 1024 \
do \
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/fargate-test:s$i \
done
Image Sizes
- 1.2 MB (Original Size)
- 16 MB
- 32 MB
- 64 MB
- 128 MB
- 512 MB
- 1024 MB
試行回数
各サイズ 10回
Resource
- 0.25 vCPU, 512 MB
- 0.5 vCPU, 1024 MB
- 1 vCPU, 2048 MB
- 2 vCPU, 4096 MB
Fargate Platform Version
1.3
計測方法
Fargate で RunTask を実行し、DescribeTasks API の結果の createdAt
と stoppedAt
の差を集計した。
RunTask
TASK_ARN=$(aws ecs run-task --cluster fargate-test --task-definition fargate-test:2 --network-configuration 'awsvpcConfiguration={subnets=subnet-593ef401,assignPublicIp=ENABLED}' --launch-type FARGATE --query 'tasks[0].taskArn' --output text)
aws ecs wait tasks-stopped --cluster fargate-test --tasks $TASK_ARN
DescribeTasks
aws ecs describe-tasks --tasks $TASK_ARN --cluster fargate-test