michimani.net

Fargate でコンテナ起動までの時間が短くなったらしいのであらためて計測してみた

2021-07-29

以前 Fargate でのコンテナ起動までの時間を計測しましたが、どうやら最近その時間が短くなっているという話を見かけたので実際に計測して前回と比較してみます。

目次

前回

前回計測したのは今年の 2月でした。

AWS SDK for Go V2 を使って Fargate for ECS でタスクを実行してコンテナが起動するまでの時間を計測してみた - michimani.net

そこから約半年たった今、 Fargate でのコンテナ起動までの時間が短くなったらしいので、あらためて計測してみます。

計測する条件

条件は前回同様に下記の内容で実施します。

❯ docker images fargate-speed-test
REPOSITORY           TAG       IMAGE ID       CREATED        SIZE
fargate-speed-test   latest    fc479f1d67e2   5 months ago   270MB
❯ cat task-definition.json | jq .
{
  "family": "fargate-speed-test",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "fargate-speed-test-app",
      "image": "000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/fargate-speed-test",
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/dev/fargate-speed-test-task",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "dev"
        }
      }
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "executionRoleArn": "arn:aws:iam::000000000000:role/fargate-speed-test-task-exec-role",
  "cpu": "256",
  "memory": "512"
}

やってみる

では計測してみます。ちなみに、前回の結果は 37.879 sec でした。残念ながら単発の実行時間しか残していなかったのでなんとも言えないですが、今回は 10 回くらい実行してその平均を出して比較してみます。

コードは前回と同じこれを使います。

This is a script using the AWS SDK for Go V2 and Go 1.16. Measure the time it takes to launch AWS Fargate for ECS.

とりあえず 1回。

❯ go run main.go
Task Created.
        TaskARN:  arn:aws:ecs:ap-northeast-1:000000000000:task/fargate-speed-test-cluster/000000000000000000000000e628db6d
        aws ecs describe-tasks --cluster fargate-speed-test-cluster --tasks arn:aws:ecs:ap-northeast-1:000000000000:task/fargate-speed-test-cluster/000000000000000000000000e628db6d

Task Stopped.
        TaskARN:  arn:aws:ecs:ap-northeast-1:000000000000:task/fargate-speed-test-cluster/000000000000000000000000e628db6d
        CreatedAt:  2021-07-29 13:34:58.037 +0000 UTC
        StartedAt:  2021-07-29 13:35:38.626 +0000 UTC
        StoppedAt:  2021-07-29 13:36:23.11 +0000 UTC
        TakenTimeToStart: 40.589s

🤔

とりあえず、ループで実行するようにコード修正してあと 9回計測してみます。

 func main() {
-       if err := runECSTask(); err != nil {
-               fmt.Println(err.Error())
+       var wg sync.WaitGroup
+
+       for i := 0; i < 9; i++ {
+               wg.Add(1)
+               go func() {
+                       defer wg.Done()
+                       if err := runECSTask(); err != nil {
+                               fmt.Println(err.Error())
+                       }
+               }()
        }
+       wg.Wait()
 }
❯ go run main.go
TakenTimeToStart: 25.07
TakenTimeToStart: 25.278
TakenTimeToStart: 25.16
TakenTimeToStart: 24.759
TakenTimeToStart: 30.34
TakenTimeToStart: 46.153
TakenTimeToStart: 47.481
TakenTimeToStart: 37.311
TakenTimeToStart: 55.649

最初の 1 回と合わせて平均とると、 35.779 sec

うーん…。もう一度 10 回実行してみます。

❯ go run main.go
TakenTimeToStart: 24.852s
TakenTimeToStart: 24.819s
TakenTimeToStart: 26.999s
TakenTimeToStart: 25.865s
TakenTimeToStart: 26.792s
TakenTimeToStart: 24.165s
TakenTimeToStart: 24.585s
TakenTimeToStart: 24.914s
TakenTimeToStart: 43.41s
TakenTimeToStart: 36.45s

平均 28.285 sec 。早くなってる感が出てきました。

という感じで合計 100 回実行した平均値は 33.087 sec でした。

前回が 37.879 sec だったので、絶対値だと 4.792 sec 、割合にすると 12.65 % 短くなってます。

まとめ

Fargate でのコンテナ起動までの時間が短くなったらしいので試してみた話でした。結果としては、 10% ほど短縮されたかな?くらいの印象でした。他のイメージサイズ、CPU、メモリの組み合わせだと違った結果が出てくるかもしれません。

現時点で Fargate ではイメージキャッシュが利用できないので、そこをなんとか…という思いは変わらずです。前回載せた issue もコメントは増えてますが、実現は難しそうなのでは?という意見もあります。

[Fargate/ECS] [Image caching]: provide image caching for Fargate. · Issue #696 · aws/containers-roadmap

どうなるんでしょうか。


comments powered by Disqus