[アップデート]Amazon ECS on EC2のCPU使用制限が最大192vCPUまで指定できるようになりました

[アップデート]Amazon ECS on EC2のCPU使用制限が最大192vCPUまで指定できるようになりました

Amazon ECSがタスクのCPU制限を192個の仮想CPUまで拡張できるようになりました
Clock Icon2025.02.22

お疲れさまです。とーちです。

EC2を使用したECSにおいて最大192vCPUまでのハードリミットが設定可能になりました。実際に試してみた内容を紹介します。

https://aws.amazon.com/about-aws/whats-new/2025/02/amazon-ecs-increases-cpu-ecs-tasks/

とりあえずまとめ

  • Amazon ECS on EC2のタスクレベルで最大192vCPUまでのハードリミットを設けられるようになった(これまでは最大10vCPU)
  • Fargateの上限は変更なし

ECS on EC2におけるCPUのハードリミットについて

ECS on Fargateと異なり、ECS on EC2ではタスク定義におけるTask Sizecpuパラメータは必須ではなくオプションです。ECS on EC2でこのパラメータを指定しない場合、コンテナは物理ホスト(EC2インスタンス)のCPUリソースを他のタスクと共有し、空きリソースがあれば使用するという動きになります。

しかし、空きリソースがあれば利用してしまうので、複数のECSタスクが一つのEC2インスタンス上で実行される場合、タスク間でのCPUリソースの競合が発生する可能性があります。

これらの課題に対応するため、Task Sizecpu定義は以下の2つの役割を持っています。

  1. CPUリソースの制限タスクレベルでCPU使用量の上限を設定し、他のタスクへの影響を防ぐ
  2. CPUリソースの予約タスクが必要とするCPUリソースを確保し、確実なリソース割り当てを保証する

今回のアップデートにより、タスク定義で指定できるCPUの上限が大幅に引き上げられました。これまで最大10vCPUまでしか指定できなかった制限が、192vCPUまで指定可能になったのです。

これによって、例えば1タスクにつき32vCPUを利用するような大規模なECSタスクで、タスク同士が互いのCPUリソースを奪い合うことなく、安定して動作させることができるようになった。というのが今回のアップデートのメリットかと思います。

ECS タスクの CPU リソース分離を検証してみた

ということで実際に多くのvCPUを使用するecsタスクを立ててCPUリソースが他のタスクに影響しない様子を確認してみようと思います。さすがに192vcpuも使って検証すると破産してしまうので、16vcpuのEC2インスタンスを立てそこで確認してみます

検証シナリオ

検証のシナリオはこうです。

  1. 16vCPU 搭載の EC2 インスタンス(c7g.4xlarge)で ECS クラスターを構築
  2. 15vCPU を指定した ECS タスク A と、1vCPU を指定した ECS タスク B を同時に実行
  3. 両タスクで yes コマンドを使用して CPU 負荷をかけ、リソース分離の状況を確認

15vCPU タスクの設定

マネジメントコンソールで、タスクレベルの vCPU を 15 に設定します。以前は 11vCPU 以上を指定するとエラーとなっていましたが、現在は問題なく設定できます。

image.png

なお、192vCPU 以上を指定すると以下のようなエラーが表示されます

image.png

コンテナレベルではTask Sizecpu定義にvCPU数を指定している場合、Task Size側で指定したvCPU数を超えない範囲での指定が可能です。

image.png

実際の検証

環境構築

ECS クラスターを立ち上げ、15vCPU と 1vCPU の設定を持つ 2 つの ECS タスクを同一の EC2 インスタンス上で起動しました

image.png

タスク定義

今回使用したタスク定義は以下の通りです(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 使用状況の確認

  1. まず 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
  1. 次に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を使えていました

  1. 続いて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タスクを複数動かすというときに役立ちそうですね。私は具体的にはそういったワークロードはイメージできないのですが、おそらく機械学習のトレーニングやハイパフォーマンスコンピューティングの分野で使う機会があるのかなと思います。

以上、とーちでした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.