はじめに
AWSのCloudWatchメトリクスでECSのCPU使用率を見ていて、CPU使用率と一言で言っても種類があったり、CPU使用率が100%を超えていることがあって一体どうなっているのかと思ったりしたので、ECSのCPU使用率について整理した。
ECSのCPU使用率は2種類
ECSのCPU使用率は2種類ある。
①クラスターCPU使用率
クラスターのタスクが使用しているCPUユニット数の合計 ×100 / クラスターのコンテナインスタンスに登録されているCPUユニット数の合計
▼CloudWatchメトリクスで選択するディメンション
・ClusterName
②サービスCPU使用率
タスクが使用しているCPUユニット数の合計 ×100 / (タスクが予約しているCPUユニット数の合計×タスク数)
▼CloudWatchメトリクスで選択するディメンション
・ClusterName
・ServiceName
クラスターCPU使用率の注意点
クラスターCPU使用率は、あくまでコンテナインスタンス全体で利用可能なCPUユニット数のうち、ECSタスクが利用しているCPUユニット数のことであって、インスタンスでECSタスク以外に動いている処理、例えばインスタンスのOS自体が使用しているCPUユニット数は含まれない。
そのため、クラスターCPU使用率は、コンテナインスタンスのインスタンス自体のCPU使用率とイコールではない点に注意が必要である。
サービスCPU使用率が100%を超える事象
サービスCPU使用率は、100%を大きく超えることがある。場合によっては1000%を超えることもある。
これはなぜかというと、コンテナインスタンスのCPUユニット数に空きがある場合、タスクがそのCPU予約ユニット数を超えてCPUを使用できるからである。
例えば、登録されているCPUユニット数が2048であるコンテナインスタンス上で、CPU予約ユニット数が128であるタスクAを1つ起動しているとする。
このとき、タスクA以外に起動しているタスクがない場合、タスクAは自身が予約しているCPUユニット数128を超えて、最大でコンテナインスタンスが持つCPUユニット数2048を使用することが可能となる。
このとき、サービスCPU使用率は1600%(2048 / 128)、クラスターCPU使用率は100%(2048 / 2048)となる。
これは飲食店をイメージすると理解しやすい。例えば50席ある店に5人で行こうと思い、5席予約したとする。5席分は予約しているので、5人は確実に入店することができるが、もし他に客が1人もおらず席が空いている場合、さらに知り合いを呼んで、空いている席をすべて使うことができる。
このようにして、コンテナインスタンスのCPUに空きがある場合に、あらかじめ予約した分を超えてCPUを使用できるため、サービスCPU使用率が100%を超えることがあり得る。
最後に
AWSでECSのCPU使用率を確認する際はぜひ参考にしてください。