[アップデート]Amazon ECS on EC2のCPU使用制限が最大192vCPUまで指定できるようになりました
お疲れさまです。とーちです。
EC2を使用したECSにおいて最大192vCPUまでのハードリミットが設定可能になりました。実際に試してみた内容を紹介します。
とりあえずまとめ
- Amazon ECS on EC2のタスクレベルで最大192vCPUまでのハードリミットを設けられるようになった(これまでは最大10vCPU)
- Fargateの上限は変更なし
ECS on EC2におけるCPUのハードリミットについて
ECS on Fargateと異なり、ECS on EC2ではタスク定義におけるTask Size
のcpu
パラメータは必須ではなくオプションです。ECS on EC2でこのパラメータを指定しない場合、コンテナは物理ホスト(EC2インスタンス)のCPUリソースを他のタスクと共有し、空きリソースがあれば使用するという動きになります。
しかし、空きリソースがあれば利用してしまうので、複数のECSタスクが一つのEC2インスタンス上で実行される場合、タスク間でのCPUリソースの競合が発生する可能性があります。
これらの課題に対応するため、Task Size
のcpu
定義は以下の2つの役割を持っています。
- CPUリソースの制限タスクレベルでCPU使用量の上限を設定し、他のタスクへの影響を防ぐ
- CPUリソースの予約タスクが必要とするCPUリソースを確保し、確実なリソース割り当てを保証する
今回のアップデートにより、タスク定義で指定できるCPUの上限が大幅に引き上げられました。これまで最大10vCPUまでしか指定できなかった制限が、192vCPUまで指定可能になったのです。
これによって、例えば1タスクにつき32vCPUを利用するような大規模なECSタスクで、タスク同士が互いのCPUリソースを奪い合うことなく、安定して動作させることができるようになった。というのが今回のアップデートのメリットかと思います。
ECS タスクの CPU リソース分離を検証してみた
ということで実際に多くのvCPUを使用するecsタスクを立ててCPUリソースが他のタスクに影響しない様子を確認してみようと思います。さすがに192vcpuも使って検証すると破産してしまうので、16vcpuのEC2インスタンスを立てそこで確認してみます
検証シナリオ
検証のシナリオはこうです。
- 16vCPU 搭載の EC2 インスタンス(c7g.4xlarge)で ECS クラスターを構築
- 15vCPU を指定した ECS タスク A と、1vCPU を指定した ECS タスク B を同時に実行
- 両タスクで yes コマンドを使用して CPU 負荷をかけ、リソース分離の状況を確認
15vCPU タスクの設定
マネジメントコンソールで、タスクレベルの vCPU を 15 に設定します。以前は 11vCPU 以上を指定するとエラーとなっていましたが、現在は問題なく設定できます。
なお、192vCPU 以上を指定すると以下のようなエラーが表示されます
コンテナレベルではTask Size
のcpu
定義にvCPU数を指定している場合、Task Size側で指定したvCPU数を超えない範囲での指定が可能です。
実際の検証
環境構築
ECS クラスターを立ち上げ、15vCPU と 1vCPU の設定を持つ 2 つの ECS タスクを同一の EC2 インスタンス上で起動しました
タスク定義
今回使用したタスク定義は以下の通りです(15vCPU の例、1vCPUのほうも基本的に同じで違いはcpuの値)
{
"image": "ubuntu:latest",
"cpu": 15360,
"memory": 2048,
"command": [
"bash",
"-c",
"apt-get update && apt-get install -y yes && yes > /dev/null"
]
}
yes
コマンドは標準出力に連続して "y" を出力し続けるコマンドで、私はCPUに負荷をかけるときによく使います。
CPU 使用状況の確認
- まず 1vCPU タスクの状況を確認します。topコマンドでみるとyesコマンドが1個のvCPUをほぼ100%使用できています
Tasks: 4 total, 2 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.4 us, 10.2 sy, 0.0 ni, 87.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 31497.1 total, 29586.0 free, 844.3 used, 1391.8 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 30652.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
137 root 20 0 2268 752 680 R 99.7 0.0 47:50.97 yes
- 次に15vCPUのほうのコンテナに入ったあと
yes > /dev/null &
を14回分(15個分のyesプロセスがある状態)実行してtopコマンドを見てみます。各yesコマンドのプロセスはそれぞれ100%CPUを使用できています
Tasks: 18 total, 16 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 19.9 us, 80.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 31497.1 total, 29584.2 free, 845.7 used, 1392.2 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 30651.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
137 root 20 0 2268 752 676 R 100.0 0.0 42:23.76 yes
148 root 20 0 2268 768 692 R 100.0 0.0 0:51.34 yes
149 root 20 0 2268 752 676 R 100.0 0.0 0:50.21 yes
151 root 20 0 2268 768 692 R 100.0 0.0 0:15.85 yes
153 root 20 0 2268 768 692 R 100.0 0.0 0:14.29 yes
154 root 20 0 2268 768 692 R 100.0 0.0 0:13.55 yes
155 root 20 0 2268 756 680 R 100.0 0.0 0:12.81 yes
156 root 20 0 2268 768 692 R 100.0 0.0 0:12.07 yes
158 root 20 0 2268 768 692 R 100.0 0.0 0:10.68 yes
160 root 20 0 2268 768 692 R 100.0 0.0 0:09.19 yes
161 root 20 0 2268 768 692 R 100.0 0.0 0:08.51 yes
162 root 20 0 2268 768 692 R 100.0 0.0 0:07.91 yes
152 root 20 0 2268 768 692 R 99.7 0.0 0:15.04 yes
157 root 20 0 2268 768 692 R 99.7 0.0 0:11.35 yes
159 root 20 0 2268 764 688 R 99.3 0.0 0:09.91 yes
一応、この時点での1vCPUのコンテナのtopの状況も見てみましたがちゃんと100%CPUを使えていました
- 続いて15vCPUのコンテナのほうで追加で3つほどyesコマンドを立ち上げてみてtopを見てみます
top - 07:07:56 up 1:00, 0 user, load average: 16.87, 10.49, 5.55
Tasks: 21 total, 19 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 19.4 us, 80.5 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 31497.1 total, 29577.1 free, 852.4 used, 1392.8 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 30644.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
151 root 20 0 2268 768 692 R 97.3 0.0 4:11.02 yes
152 root 20 0 2268 768 692 R 95.3 0.0 4:10.35 yes
175 root 20 0 2268 752 676 R 94.7 0.0 0:12.07 yes
157 root 20 0 2268 768 692 R 93.7 0.0 4:11.18 yes
158 root 20 0 2268 768 692 R 92.7 0.0 4:10.21 yes
160 root 20 0 2268 768 692 R 91.4 0.0 4:05.55 yes
161 root 20 0 2268 768 692 R 91.4 0.0 4:04.34 yes
162 root 20 0 2268 768 692 R 91.0 0.0 4:07.34 yes
154 root 20 0 2268 768 692 R 90.7 0.0 4:12.43 yes
149 root 20 0 2268 752 676 R 88.7 0.0 4:48.69 yes
153 root 20 0 2268 768 692 R 87.0 0.0 4:10.79 yes
137 root 20 0 2268 752 676 R 79.1 0.0 46:21.39 yes
148 root 20 0 2268 768 692 R 73.1 0.0 4:50.98 yes
173 root 20 0 2268 768 692 R 72.4 0.0 0:17.09 yes
155 root 20 0 2268 756 680 R 71.4 0.0 4:08.85 yes
159 root 20 0 2268 764 688 R 69.4 0.0 4:08.77 yes
156 root 20 0 2268 768 692 R 67.4 0.0 4:11.03 yes
174 root 20 0 2268 768 692 R 50.5 0.0 0:15.31 yes
上記の通り、100%cpuを使えていないyesプロセスが出始めましたね。
ではこの状態で1vCPUのコンテナのCPU使用状況に影響がないかを見てみます。以下の通りyesプロセスは引き続き100%CPUを使用できていますね。
top - 07:09:57 up 1:02, 0 user, load average: 18.76, 13.42, 7.25
Tasks: 4 total, 2 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 20.3 us, 79.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 31497.1 total, 29588.7 free, 840.8 used, 1392.8 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 30656.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
137 root 20 0 2268 752 680 R 100.0 0.0 60:14.26 yes
15vCPU タスク内で 15vCPU以上のプロセスが起動されても、1vCPU タスクの CPU 使用率は 100% を維持できていることが確認できました。これにより、タスクごとの CPU リソースのハードリミットが正しく機能していることが検証できました。
まとめ
以上、ecs on ec2で192vCPUまで使えるようになったというアップデートでした。大量のvCPUを使用するECSタスクを複数動かすというときに役立ちそうですね。私は具体的にはそういったワークロードはイメージできないのですが、おそらく機械学習のトレーニングやハイパフォーマンスコンピューティングの分野で使う機会があるのかなと思います。
以上、とーちでした。