この AWS ブログを翻訳しながら理解をしたことのメモ。
参考リンク
- Amazon ECS タスク定義の"タスクサイズのCPU"と”コンテナのCPUユニット”の違いを調べてみた
- https://github.com/aws/amazon-ecs-agent/issues/1735#issuecomment-448699262
- https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/resource_management_guide/sec-cpu
- https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/resource_management_guide/sec-memory
準備
適当に 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
に指定されている。コンテナ定義で指定した memory
と memoryReservation
も、それぞれ memory.limit_in_bytes
と memory.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 ~]#