ECS のリソース設定の理解

この AWS ブログを翻訳しながら理解をしたことのメモ。

参考リンク

準備

適当に ECS on EC2 のクラスターを用意する。

Terraform で作成するサンプルはこちら。

この環境のコンテナインスタンスは m6i.large でタスクが何も動いていない状態では以下の容量がある。

コンテナインスタンスの利用可能な容量との関係

以下のパラメータを設定したタスクを起動する。

設定 設定値
タスク CPU 768
タスクメモリ 768 MiB
コンテナ定義の CPU ユニット 512
コンテナ定義の memory 512 MiB
コンテナ定義の memoryReservation 256 MiB

いずれの設定値も予約になるので、コンテナインスタンスの利用可能な容量から引かれる。この場合、2048 - 768 = 1280 CPU ユニット、7833 - 768 = 7065 MiB が利用可能となっている。より上位で設定したものが予約となる。

タスクのスケジュール時には利用可能な容量がないとスケジュールされない。

cgroup を確認する

コンテナインスタンスにログインして確認する。

コンテナを確認すると、コンテナの 1 つ上の階層に cgroup がいることがわかる。これがタスクの cgroup と思われる。

[root@ip-10-0-11-145 ~]# docker ps
CONTAINER ID   IMAGE                            COMMAND                  CREATED             STATUS                       PORTS     NAMES
55dd991455cf   nginx                            "/docker-entrypoint.…"   2 minutes ago       Up 2 minutes                 80/tcp    ecs-task-size-test-1-nginx-ec8582fc88fab49b3e00
2db761b725bb   amazon/amazon-ecs-agent:latest   "/agent"                 About an hour ago   Up About an hour (healthy)             ecs-agent
[root@ip-10-0-11-145 ~]# docker inspect 55dd991455cf --format '{{ .HostConfig.CgroupParent }}'
/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10
[root@ip-10-0-11-145 ~]#

タスクとコンテナの cgroup を確認する。

[root@ip-10-0-11-145 ~]# ls -l /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10
total 0
drwxr-xr-x 2 root root 0 Jun 17 01:52 55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca
-rw-r--r-- 1 root root 0 Jun 17 02:05 cgroup.clone_children
-rw-r--r-- 1 root root 0 Jun 17 02:05 cgroup.procs
-rw-r--r-- 1 root root 0 Jun 17 01:52 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jun 17 01:52 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.shares
-r--r--r-- 1 root root 0 Jun 17 02:05 cpu.stat
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.stat
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_all
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_sys
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_user
-rw-r--r-- 1 root root 0 Jun 17 02:05 notify_on_release
-rw-r--r-- 1 root root 0 Jun 17 02:05 tasks
[root@ip-10-0-11-145 ~]# ls -l /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca
total 0
-rw-r--r-- 1 root root 0 Jun 17 02:05 cgroup.clone_children
-rw-r--r-- 1 root root 0 Jun 17 01:52 cgroup.procs
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jun 17 01:52 cpu.shares
-r--r--r-- 1 root root 0 Jun 17 01:52 cpu.stat
-r--r--r-- 1 root root 0 Jun 17 01:52 cpuacct.stat
-rw-r--r-- 1 root root 0 Jun 17 01:52 cpuacct.usage
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_all
-r--r--r-- 1 root root 0 Jun 17 01:52 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_sys
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_user
-rw-r--r-- 1 root root 0 Jun 17 02:05 notify_on_release
-rw-r--r-- 1 root root 0 Jun 17 02:05 tasks
[root@ip-10-0-11-145 ~]# ls -l /sys/fs/cgroup/memory/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10
total 0
drwxr-xr-x 2 root root 0 Jun 17 01:52 55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca
-rw-r--r-- 1 root root 0 Jun 17 02:02 cgroup.clone_children
--w--w--w- 1 root root 0 Jun 17 02:02 cgroup.event_control
-rw-r--r-- 1 root root 0 Jun 17 02:02 cgroup.procs
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.failcnt
--w------- 1 root root 0 Jun 17 02:02 memory.force_empty
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.failcnt
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.max_usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.slabinfo
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.tcp.failcnt
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.tcp.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.tcp.max_usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.tcp.usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.max_usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.memsw.failcnt
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.memsw.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.memsw.max_usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.memsw.usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.move_charge_at_immigrate
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.numa_stat
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.oom_control
---------- 1 root root 0 Jun 17 02:02 memory.pressure_level
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.soft_limit_in_bytes
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.stat
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.swappiness
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.use_hierarchy
-rw-r--r-- 1 root root 0 Jun 17 02:02 notify_on_release
-rw-r--r-- 1 root root 0 Jun 17 02:02 tasks
[root@ip-10-0-11-145 ~]# ls -l /sys/fs/cgroup/memory/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca
total 0
-rw-r--r-- 1 root root 0 Jun 17 02:04 cgroup.clone_children
--w--w--w- 1 root root 0 Jun 17 01:52 cgroup.event_control
-rw-r--r-- 1 root root 0 Jun 17 01:52 cgroup.procs
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.failcnt
--w------- 1 root root 0 Jun 17 02:04 memory.force_empty
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.failcnt
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.max_usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 02:04 memory.kmem.slabinfo
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.tcp.failcnt
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.tcp.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.tcp.max_usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.tcp.usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.max_usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.memsw.failcnt
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.memsw.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.memsw.max_usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 01:52 memory.memsw.usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:04 memory.move_charge_at_immigrate
-r--r--r-- 1 root root 0 Jun 17 02:04 memory.numa_stat
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.oom_control
---------- 1 root root 0 Jun 17 02:04 memory.pressure_level
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.soft_limit_in_bytes
-r--r--r-- 1 root root 0 Jun 17 01:52 memory.stat
-rw-r--r-- 1 root root 0 Jun 17 02:04 memory.swappiness
-r--r--r-- 1 root root 0 Jun 17 01:52 memory.usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:04 memory.use_hierarchy
-rw-r--r-- 1 root root 0 Jun 17 02:04 notify_on_release
-rw-r--r-- 1 root root 0 Jun 17 02:04 tasks
[root@ip-10-0-11-145 ~]#

CPU サブシステム

CPU 設定を確認する。コンテナの CPU ユニットは docker run の --cpu-shares にマッピングされ、値が反映されている。タスクのほうは 1024 は固定値となっている。

[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/cpu.shares
1024
[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca/cpu.shares
512
[root@ip-10-0-11-145 ~]#

cpu.cfs_period_us と cpu.cfs_quota_us を確認すると、1024 に対して 75000/100000 が絶対値となり、タスクサイズで設定した 768 がここに反映されているように見える。

[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/cpu.cfs_period_us
100000
[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/cpu.cfs_quota_us
75000
[root@ip-10-0-11-145 ~]#

コンテナのほうは制限が設けられていない。

[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca/cpu.cfs_period_us
100000
[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca/cpu.cfs_quota_us
-1
[root@ip-10-0-11-145 ~]#

memory サブシステム

タスクサイズに指定した値はハード制限となり、memory.limit_in_bytes に指定されている。コンテナ定義で指定した memorymemoryReservation も、それぞれ memory.limit_in_bytesmemory.soft_limit_in_bytes に反映されている。

[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/memory/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/memory.limit_in_bytes
805306368
[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/memory/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/memory.soft_limit_in_bytes
9223372036854771712
[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/memory/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca/memory.limit_in_bytes
536870912
[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/memory/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca/memory.soft_limit_in_bytes
268435456
[root@ip-10-0-11-145 ~]#

なるべく設定しない場合の値の確認

以下のパラメータを設定したタスクを起動する。メモリに関してはどこかでの設定が必須。

設定 設定値
タスク CPU 設定なし
タスクメモリ 設定なし
コンテナ定義の CPU ユニット 設定なし
コンテナ定義の memory 設定足
コンテナ定義の memoryReservation 256 MiB

タスクの cgroup を確認する。

[root@ip-10-0-11-24 ~]# docker ps
CONTAINER ID   IMAGE                            COMMAND                  CREATED          STATUS                 PORTS     NAMES
e518b184b577   nginx                            "/docker-entrypoint.…"   39 seconds ago   Up 38 seconds          80/tcp    ecs-task-size-test-2-1-nginx-dec6fdb1c0c8ac9e4800
6f53f5cd2e54   amazon/amazon-ecs-agent:latest   "/agent"                 2 hours ago      Up 2 hours (healthy)             ecs-agent
[root@ip-10-0-11-24 ~]# docker inspect e518b184b577 --format '{{ .HostConfig.CgroupParent }}'
/ecs/08c18cf2897547da883591f93b4d170f
[root@ip-10-0-11-24 ~]# ls -l /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/
total 0
-rw-r--r-- 1 root root 0 Jun 17 02:27 cgroup.clone_children
-rw-r--r-- 1 root root 0 Jun 17 02:27 cgroup.procs
-rw-r--r-- 1 root root 0 Jun 17 02:27 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jun 17 02:27 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jun 17 02:27 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jun 17 02:27 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jun 17 02:24 cpu.shares
-r--r--r-- 1 root root 0 Jun 17 02:27 cpu.stat
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.stat
-rw-r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage_all
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage_sys
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage_user
drwxr-xr-x 2 root root 0 Jun 17 02:24 e518b184b577c9b2644b94a81d12254edee651a0178173e2a607131a48d30ce1
-rw-r--r-- 1 root root 0 Jun 17 02:27 notify_on_release
-rw-r--r-- 1 root root 0 Jun 17 02:27 tasks
[root@ip-10-0-11-24 ~]#

CPU サブシステム

CPU を設定しない場合は 2 が設定される。これは Linux カーネルが許容する最小値であるため。

[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/cpu.shares
2
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/cpu.cfs_period_us
100000
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/cpu.cfs_quota_us
-1
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/e518b184b577c9b2644b94a81d12254edee651a0178173e2a607131a48d30ce1/cpu.shares
2
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/e518b184b577c9b2644b94a81d12254edee651a0178173e2a607131a48d30ce1/cpu.cfs_period_us
100000
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/e518b184b577c9b2644b94a81d12254edee651a0178173e2a607131a48d30ce1/cpu.cfs_quota_us
-1
[root@ip-10-0-11-24 ~]#

memory サブシステム

設定していないところは上限とおぼしき値が設定されている。

[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/memory/ecs/08c18cf2897547da883591f93b4d170f/memory.limit_in_bytes
9223372036854771712
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/memory/ecs/08c18cf2897547da883591f93b4d170f/memory.soft_limit_in_bytes
9223372036854771712
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/memory/ecs/08c18cf2897547da883591f93b4d170f/e518b184b577c9b2644b94a81d12254edee651a0178173e2a607131a48d30ce1/memory.limit_in_bytes
9223372036854771712
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/memory/ecs/08c18cf2897547da883591f93b4d170f/e518b184b577c9b2644b94a81d12254edee651a0178173e2a607131a48d30ce1/memory.soft_limit_in_bytes
268435456
[root@ip-10-0-11-24 ~]#