AWS Fargateのネットワーク帯域を測定してみた(同一AZ内)
みなさんは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