🐟

AWS Fargateのネットワーク帯域を測定してみた(同一AZ内)

2023/01/22に公開

みなさんはAWS Fargate使っていますか?
AWS Fargateは2017年11月にリリース(AWS News Blog)されてから5年以上が経ちます。
2017年のリリース当時は最大vCPUが4, 最大Memoryが30GBだったのですが、2022年9月AWS What's NewにはAWS Fargateで利用できる最大vCPUが16, 最大Memoryが120GBに拡張されました。

さて、今回はそんなAWS Fargateのネットワーク帯域(Bandwidth)を測定していきたいと思います。

前提

  • Fargate(AWS Batch)前提とします。
  • 測定時のCPUアーキテクチャはX86_64とします。
  • 東京リージョンの同一AZ内間での帯域測定とします。
  • シングルフロートラフィックでの帯域測定とします。
  • 測定方法および測定結果については最新の注意を払って記載していますが、あくまで参考としてください。
    実際に設計や構築する際にはご自身で測定することをお勧めします。
    (帯域測定する環境構築のTerraformのコードや測定方法などをGitHubに置いておきますので、ご自由にお使いください)

Fargateのリソースパターン

AWS Fargate Pricingに記載の通り、CPUアーキテクチャごとにCPU/Memoryの組み合わせがあります(2022年1月22日現在)
※Windows containerでは一部のリソースパターンしか利用できないため注意してください(AWS公式ドキュメント Task CPU and memory)
Windows containerを使う場面はあまり多くないとは思いますので、今回はLinux/X86_64に絞った74パターンの測定をします。
正直最初は10パターンくらいやれば良いかなーと思ったのですが、せっかくなので全パターン測定しようと思います。

Fargate リソースパターン表(2023年1月22現在)

CPU Memory Values pattern
0.25 vCPU 0.5 GB, 1 GB, and 2 GB 3
0.5 vCPU Min. 1 GB and Max. 4 GB, in 1 GB increments 4
1 vCPU Min. 2 GB and Max. 8 GB, in 1 GB increments 7
2 vCPU Min. 4 GB and Max. 16 GB, in 1 GB increments 13
4 vCPU Min. 8 GB and Max. 30 GB, in 1 GB increments 23
8 vCPU Min. 16 GB and Max. 60 GB, in 4 GB increments 12
16 vCPU Min. 32 GB and Max. 120 GB, in 8 GB increments 12

帯域測定環境

今回はiperf3を用いて測定します(30秒間の帯域測定)
iperf3サーバとしてEC2(Amazon Linux2, c6gn.8xlarge)、iperf3クライアントとしてFargate(AWS Batch)を利用します。
EC2に比較的大きなインスタンスを利用しているのはネットワークのベースパフォーマンスがバーストしないものかつ、安めなものを選んだらc6gn.8xlargeが一番良さそうだったので利用しています。

帯域測定環境構成図

①間の帯域を測定します。

測定方法

  • AWS BatchのFargateからiperf3 -c 10.0.10.100 -t 30 -Vを発行して測定します。
  • Server側の帯域を圧迫しないよう、AWS BatchのjobDependencyを利用して1ジョブずつ実行します。
  • AWS Batchジョブはお手製のシェルで投入します。
お手製シェル
#!/bin/bash

# Check args
if [ $# != 3 ]; then
    echo "
-------------Usage-------------
bash ./aws-batch-job-exec.sh \\
fargate-resource-patter-lists.csv \\
arn:aws:batch:ap-northeast-1:123456789012:job-queue/measured-fargate-network-bandwidth-job-queue \\
arn:aws:batch:ap-northeast-1:123456789012:job-definition/measured-fargate-network-bandwidth-job-definition:3

===========Description===========
Arg1: Fargate resource pattern-lists
Arg2: Job queue arn (Refer to the output of \`terraform apply\`)
Arg3: Job definition arn (Refer to the output of \`terraform apply\`)

*********************************"
    exit 1
fi

JOB_ID=""

while IFS=, read VCPU MEMORY || [ -n "${VCPU}" ]; do
    echo "-Start submit job(CPU: ${VCPU}, MEMORY: ${MEMORY})"
    # first time
    if [ -z ${JOB_ID} ]; then
        JOB_RESPONSE=$(aws batch submit-job \
            --job-name "measured-network-bandwidth-vcpu-$(echo ${VCPU} | sed -e "s/\./_/")-memory-$(echo ${MEMORY} | sed -e "s/\./_/")" \
            --job-queue $2 \
            --job-definition $3 \
            --container-overrides "resourceRequirements=[{value=${VCPU},type=VCPU},{value=${MEMORY},type=MEMORY}]")
    # after the second time
    else
        JOB_RESPONSE=$(aws batch submit-job \
            --job-name "measured-network-bandwidth-vcpu-$(echo ${VCPU} | sed -e "s/\./_/")-memory-$(echo ${MEMORY} | sed -e "s/\./_/")" \
            --job-queue $2 \
            --job-definition $3 \
            --container-overrides "resourceRequirements=[{value=${VCPU},type=VCPU},{value=${MEMORY},type=MEMORY}]" \
            --depends-on "jobId=${JOB_ID},type=N_TO_N")
    fi
    JOB_ID=$(echo $JOB_RESPONSE | jq .jobId)
    echo "--Complete submit job(CPU: ${VCPU}, MEMORY: ${MEMORY})"
done <$1

参考ですが、AWS Batchジョブ投入から完了まで約1時間半かかりました。
測定費用は厳密に測っていないですが、おそらく$10未満(※)かと思います。
※測定後速やかにリソース削除した場合

投入から完了までの時間は↓のジョブ詳細開いてもらえればと思います(AWSマネコンの結果をほぼそのまま貼っています)

AWS Batchジョブ詳細
Name Created at Started at Stopped at Total run time Status
measured-network-bandwidth-vcpu-16-memory-122880 Jan 22 2023 13:53:58 Jan 22 2023 15:24:50 Jan 22 2023 15:25:43 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-16-memory-114688 Jan 22 2023 13:53:57 Jan 22 2023 15:23:35 Jan 22 2023 15:24:28 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-16-memory-106496 Jan 22 2023 13:53:57 Jan 22 2023 15:22:22 Jan 22 2023 15:23:15 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-16-memory-98304 Jan 22 2023 13:53:56 Jan 22 2023 15:21:06 Jan 22 2023 15:22:00 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-16-memory-90112 Jan 22 2023 13:53:55 Jan 22 2023 15:19:51 Jan 22 2023 15:20:44 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-16-memory-81920 Jan 22 2023 13:53:55 Jan 22 2023 15:18:38 Jan 22 2023 15:19:31 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-16-memory-73728 Jan 22 2023 13:53:54 Jan 22 2023 15:17:23 Jan 22 2023 15:18:17 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-16-memory-65536 Jan 22 2023 13:53:54 Jan 22 2023 15:16:07 Jan 22 2023 15:17:01 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-16-memory-57344 Jan 22 2023 13:53:53 Jan 22 2023 15:14:53 Jan 22 2023 15:15:47 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-16-memory-49152 Jan 22 2023 13:53:52 Jan 22 2023 15:13:38 Jan 22 2023 15:14:31 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-16-memory-40960 Jan 22 2023 13:53:52 Jan 22 2023 15:12:22 Jan 22 2023 15:13:15 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-16-memory-32768 Jan 22 2023 13:53:51 Jan 22 2023 15:11:04 Jan 22 2023 15:11:57 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-8-memory-61440 Jan 22 2023 13:53:50 Jan 22 2023 15:09:48 Jan 22 2023 15:10:41 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-8-memory-57344 Jan 22 2023 13:53:50 Jan 22 2023 15:08:31 Jan 22 2023 15:09:24 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-8-memory-53248 Jan 22 2023 13:53:49 Jan 22 2023 15:07:17 Jan 22 2023 15:08:11 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-8-memory-49152 Jan 22 2023 13:53:48 Jan 22 2023 15:06:01 Jan 22 2023 15:06:55 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-8-memory-45056 Jan 22 2023 13:53:48 Jan 22 2023 15:04:47 Jan 22 2023 15:05:40 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-8-memory-40960 Jan 22 2023 13:53:47 Jan 22 2023 15:03:35 Jan 22 2023 15:04:28 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-8-memory-36864 Jan 22 2023 13:53:47 Jan 22 2023 15:02:21 Jan 22 2023 15:03:14 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-8-memory-32768 Jan 22 2023 13:53:46 Jan 22 2023 15:01:05 Jan 22 2023 15:01:59 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-8-memory-28672 Jan 22 2023 13:53:45 Jan 22 2023 14:59:50 Jan 22 2023 15:00:44 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-8-memory-24576 Jan 22 2023 13:53:45 Jan 22 2023 14:58:37 Jan 22 2023 14:59:30 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-8-memory-20480 Jan 22 2023 13:53:44 Jan 22 2023 14:57:21 Jan 22 2023 14:58:15 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-8-memory-16384 Jan 22 2023 13:53:43 Jan 22 2023 14:56:06 Jan 22 2023 14:57:00 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-30720 Jan 22 2023 13:53:43 Jan 22 2023 14:54:52 Jan 22 2023 14:55:46 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-29696 Jan 22 2023 13:53:42 Jan 22 2023 14:53:37 Jan 22 2023 14:54:31 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-28672 Jan 22 2023 13:53:41 Jan 22 2023 14:52:22 Jan 22 2023 14:53:15 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-27648 Jan 22 2023 13:53:41 Jan 22 2023 14:51:08 Jan 22 2023 14:52:01 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-26624 Jan 22 2023 13:53:40 Jan 22 2023 14:49:55 Jan 22 2023 14:50:48 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-25600 Jan 22 2023 13:53:39 Jan 22 2023 14:48:40 Jan 22 2023 14:49:33 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-24576 Jan 22 2023 13:53:39 Jan 22 2023 14:47:26 Jan 22 2023 14:48:19 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-23552 Jan 22 2023 13:53:38 Jan 22 2023 14:46:11 Jan 22 2023 14:47:05 0 days 00:00:54 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-22528 Jan 22 2023 13:53:37 Jan 22 2023 14:44:55 Jan 22 2023 14:45:49 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-21504 Jan 22 2023 13:53:37 Jan 22 2023 14:43:44 Jan 22 2023 14:44:38 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-20480 Jan 22 2023 13:53:36 Jan 22 2023 14:42:28 Jan 22 2023 14:43:21 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-19456 Jan 22 2023 13:53:35 Jan 22 2023 14:41:13 Jan 22 2023 14:42:07 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-18432 Jan 22 2023 13:53:35 Jan 22 2023 14:40:00 Jan 22 2023 14:40:53 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-17408 Jan 22 2023 13:53:34 Jan 22 2023 14:38:47 Jan 22 2023 14:39:40 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-16384 Jan 22 2023 13:53:33 Jan 22 2023 14:37:33 Jan 22 2023 14:38:26 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-15360 Jan 22 2023 13:53:33 Jan 22 2023 14:36:17 Jan 22 2023 14:37:11 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-14336 Jan 22 2023 13:53:32 Jan 22 2023 14:35:04 Jan 22 2023 14:35:57 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-13312 Jan 22 2023 13:53:31 Jan 22 2023 14:33:43 Jan 22 2023 14:34:36 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-12288 Jan 22 2023 13:53:31 Jan 22 2023 14:32:25 Jan 22 2023 14:33:18 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-11264 Jan 22 2023 13:53:30 Jan 22 2023 14:31:06 Jan 22 2023 14:31:59 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-10240 Jan 22 2023 13:53:29 Jan 22 2023 14:29:53 Jan 22 2023 14:30:47 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-9216 Jan 22 2023 13:53:29 Jan 22 2023 14:28:32 Jan 22 2023 14:29:25 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-4-memory-8192 Jan 22 2023 13:53:28 Jan 22 2023 14:27:15 Jan 22 2023 14:28:09 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-16384 Jan 22 2023 13:53:27 Jan 22 2023 14:26:04 Jan 22 2023 14:26:57 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-15360 Jan 22 2023 13:53:27 Jan 22 2023 14:24:50 Jan 22 2023 14:25:43 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-14336 Jan 22 2023 13:53:26 Jan 22 2023 14:23:37 Jan 22 2023 14:24:30 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-13312 Jan 22 2023 13:53:26 Jan 22 2023 14:22:20 Jan 22 2023 14:23:13 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-12288 Jan 22 2023 13:53:25 Jan 22 2023 14:21:03 Jan 22 2023 14:21:56 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-11264 Jan 22 2023 13:53:24 Jan 22 2023 14:19:50 Jan 22 2023 14:20:43 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-10240 Jan 22 2023 13:53:24 Jan 22 2023 14:18:38 Jan 22 2023 14:19:32 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-9216 Jan 22 2023 13:53:23 Jan 22 2023 14:17:21 Jan 22 2023 14:18:15 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-8192 Jan 22 2023 13:53:22 Jan 22 2023 14:16:06 Jan 22 2023 14:16:59 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-7168 Jan 22 2023 13:53:22 Jan 22 2023 14:14:51 Jan 22 2023 14:15:44 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-6144 Jan 22 2023 13:53:21 Jan 22 2023 14:13:36 Jan 22 2023 14:14:29 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-5120 Jan 22 2023 13:53:20 Jan 22 2023 14:12:20 Jan 22 2023 14:13:14 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-2-memory-4096 Jan 22 2023 13:53:19 Jan 22 2023 14:11:08 Jan 22 2023 14:12:01 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-1-memory-8192 Jan 22 2023 13:53:19 Jan 22 2023 14:09:53 Jan 22 2023 14:10:46 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-1-memory-7168 Jan 22 2023 13:53:18 Jan 22 2023 14:08:38 Jan 22 2023 14:09:31 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-1-memory-6144 Jan 22 2023 13:53:18 Jan 22 2023 14:07:24 Jan 22 2023 14:08:17 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-1-memory-5120 Jan 22 2023 13:53:17 Jan 22 2023 14:06:11 Jan 22 2023 14:07:04 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-1-memory-4096 Jan 22 2023 13:53:16 Jan 22 2023 14:04:55 Jan 22 2023 14:05:48 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-1-memory-3072 Jan 22 2023 13:53:16 Jan 22 2023 14:03:41 Jan 22 2023 14:04:34 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-1-memory-2048 Jan 22 2023 13:53:15 Jan 22 2023 14:02:29 Jan 22 2023 14:03:23 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-0_5-memory-4096 Jan 22 2023 13:53:14 Jan 22 2023 14:01:11 Jan 22 2023 14:02:05 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-0_5-memory-3072 Jan 22 2023 13:53:14 Jan 22 2023 13:59:53 Jan 22 2023 14:00:47 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-0_5-memory-2048 Jan 22 2023 13:53:13 Jan 22 2023 13:58:39 Jan 22 2023 13:59:32 0 days 00:00:52 SUCCEEDED
measured-network-bandwidth-vcpu-0_5-memory-1024 Jan 22 2023 13:53:12 Jan 22 2023 13:57:24 Jan 22 2023 13:58:18 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-0_25-memory-2048 Jan 22 2023 13:53:12 Jan 22 2023 13:56:10 Jan 22 2023 13:57:03 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-0_25-memory-1024 Jan 22 2023 13:53:11 Jan 22 2023 13:54:51 Jan 22 2023 13:55:44 0 days 00:00:53 SUCCEEDED
measured-network-bandwidth-vcpu-0_25-memory-512 Jan 22 2023 13:53:11 Jan 22 2023 13:53:36 Jan 22 2023 13:54:30 0 days 00:00:53 SUCCEEDED

測定結果

全74パターンの測定結果です。

グラフを見て分かる通り、以下4パターンの場合のみ著しく帯域が低いので再測定したのですが、CPU:4 Memory:14336のみ4.97Gbitsくらいの帯域になりましたが、他の3パターンは変わらずでした(これが俗に言うFargateガチャでしょうか・・・)

CPU,Memory
- 0.5,4096
- 4,10240
- 4,12288
- 4,14336

測定結果から推察するに、Fargateに割り当てるリソース(CPU/Memory)に関わらず、ある程度のガチャ要素がありそうです。
一定のパフォーマンスを確保したいのであればEC2(ECS on EC2, EKS on EC2)などでcontainerを動作させるのが良いかもしれません。

おわり

測定する前はFargateに割り当てるリソースによって大きく帯域が異なると思っておりました。
しかし、今回の測定条件では割り当てリソースによると言うよりはFargateガチャ(?)によって帯域が左右されるのではないか・・・という印象を受けました。
AWS(を含むクラウド)で設計する際には実際に測定してみることの重要性は知っておりましたが、実際に測定してみると想定の結果にならず面白かったです。

また、今回は同一AZ内の帯域測定でしたが、インターネットを経由した場合の帯域についても近いうちに測定してみようと思います。

この記事をきっかけにみなさんの理解や学習欲が高まれば何より嬉しいです。
今回の測定環境や測定方法はGitHubにあるTerraformを利用すれば再現できるようにしておりますので、興味が湧いたら実際に手を動かしてみてはいかがでしょうか?

ここまで読んでくださってありがとうございました。

Discussion