Linux cgroup version 2
Linux の cgroup version 2 を使って cpu リソースの制限をしてみる。
- 検証環境
- cgroup v2 のマウント状況を確認
- cgroup v2 を利用できるようにする
- cgroup とプロセスの紐づけを確認
- 新しく作成されたプロセスの cgroup を確認
- cgroup 内のファイル
- cgroup の作成
- cpu の利用を制限
- cgroup の削除
- 参考
AWS EC2 で立ち上げた Ubuntu 18.04 環境で試した。 カーネルバージョンは 5.3.0-1019-aws 。
|
|
Ubuntu 18.04 では cgroup v1 と v2 が共存している。 マウント状況は次のようになっている。
|
|
/sys/fs/cgroup/unified に cgroup v2 のファイルシステムがマウントされている。
cgroup v2 では、cgroup 内の cgroup.controllers に利用可能なコントローラが記載されている。 デフォルトでは /sys/fs/cgroup/unified/cgroup.controllers は空になっている。
これは、同じコントローラがバージョン1とバージョン2の両方にマウントすることができず、 デフォルトでは cgroup v1 にコントローラがマウントされているため。
man cgroups の Cgroups v2 unified hierarchy セクションによると、 cgroup v1 にマウントされていないコントローラが、 cgroup v2 で利用可能になる。
A cgroup v2 controller is available only if it is not currently in use via a mount against a cgroup v1 hierarchy.
先述のとおり、デフォルトでは cgroup v2 でコントローラが利用できないため、
起動時のオプションを指定して cgroup v1 を無効にし、cgroup v2 を利用できるようにする。
そのためには GRUB_CMDLINE_LINUX_DEFAULT
に systemd.unified_cgroup_hierarchy=1 cgroup_no_v1=all
を指定する。
検証環境では /etc/default/grub.d/50-cloudimg-settings.cfg で設定した。
|
|
変更したら、sudo update-grub
で更新し、再起動する。
再起動すると、cgroup v2 だけが /sys/fs/cgroup にマウントされている。
|
|
マウント位置も /sys/fs/cgroup/unified から /sys/fs/cgroup に変わっている。
cgroup.controllers を確認すると、コントローラも利用可能になっている。
|
|
cgroup に属するプロセスは cgroup.procs ファイルで管理されている。
cgroup.procs にはその cgroup に属するプロセスの PID が一行ごとに記載されている。
ルート cgroup に属する PID は cat /sys/fs/cgroup/cgroup.procs
で確認できる。
大量に表示されるので出力が割愛する。
PID の方から cgroup を確認するには /proc/${PID}/cgroup を見ればよい。
現在のプロセスの cgroup を確認してみる。
|
|
cgroup v2 では常に 0::$PATH
の形式になっている。
$PATH
の部分がルート cgroup からのパスになっている。
/sys/fs/cgroup/system.slice/snap.amazon-ssm-agent.amazon-ssm-agent.service/cgroup.procs に
現在のプロセスの PID が記載されているのが確認できる。
|
|
検証用に、何もしない無限ループのプロセスを作成する。
|
|
PID から cgroup を確認する。
|
|
先ほど確認した、現在のプロセスと同じ cgroup に紐づいたのが確認できる。
cgroup 内には次のようなファイルがある。
|
|
利用可能なコントローラ cpu, io, memory, pids 毎にいくつかのファイルがあるのがわかる。 これらのファイルを介して、この cgroup に属するプロセスへのリソース配分を制御する。
cpu.max では cpu の利用率を制限できる。
このファイルは $MAX $PERIOD
の形式で、$PERIOD
マイクロ秒あたり $MAX
マイクロ秒まで cpu を利用できる、と制限する。
デフォルトでは次のようになっている。
|
|
max
は、最大値まで利用可能であることを表す。
この設定では 100% まで利用可能。
先ほど検証用に作成したプロセスはこの cgroup に属しているので、100% cpu を利用可能になる。 確認してみると、ほぼ 100% 利用しているのがわかる。
|
|
新しい cgroup は、cgroup 階層に新しいディレクトリを作成することで作成できる。
検証用に test
という cgroup を作ってみる。
|
|
ディレクトリ(cgroup)を作成すると、自動的にファイルが作成されている。
|
|
利用可能なコントローラは次のようになっている。
|
|
作っただけでは何のプロセスも属しておらず、cgroup.procs は空になっている。
|
|
cpu も 100% 利用可能になっている。
|
|
cpu.max を変更して test cgroup の cpu の利用を 50% に制限してみる。
|
|
先述した通り cgroup に属するプロセスは cgroup.procs で管理されている。 プロセスを別の cgroup に移動するにはその PID を移動先 cgroup の cgroup.procs に追記すればよい。
先ほど作成した検証用プロセスをこの test cgroup に移動する。
|
|
移動したプロセスの cpu 利用率をを確認してみる。
|
|
移動前は 100% だったが、50% 程度に制限されているのがわかる。
PID から cgroup も調べてみる。
|
|
cgroup を削除するには、事前に所属するプロセスがない状態にする必要がある。 test cgroup に属している検証用のプロセスを kill する。
|
|
test cgroup に属しているプロセスがないことを確認。
|
|
test cgroup のディレクトリを削除する。
|
|
cgroup を作成したときと同様にディレクトリを削除するだけでよく、ファイルは自動で処理される。