前回の記事は,
今年はcgroup v2の話題を書こうと決めたときに,
そういうわけで,
今回は,
今回の実行例は,
前回書いたとおり,
cgroup v2のマウント
cgroup v2は,cgroup2
を指定してマウントします。今回試している4.
# mount -t cgroup2 cgroup2 /sys/fs/cgroup/
# grep cgroup2 /proc/self/mountinfo (マウントされているのを確認)
25 19 0:22 / /sys/fs/cgroup rw,relatime - cgroup2 cgroup2 rw
cgroup v1では,
上の実行例のようにマウントした際にcgroup rootとなる,/sys/
を確認してみましょう。
# ls /sys/fs/cgroup/ cgroup.controllers cgroup.procs cgroup.subtree_control
cgroup v2でコントロールを行うためのファイルが3つ現れており,
なお,
cgroup v2コアで使用するファイル
cgroup v2の各cgroup内に現れるファイルのうち,
表1 cgroup v2コアで使用するファイル
ファイル名 | 説明 |
---|---|
cgroup. |
そのcgroupで使えるサブシステム |
cgroup. |
そのcgroupに属するプロセスの登録, |
cgroup. |
子cgroupで有効にするサブシステム |
cgroup. |
そのcgroupと子孫のcgroupにプロセスが所属しているかを確認する。また, |
cgroupの作成
cgroupを作成する方法は,
"test01"というcgroupを作ってみましょう。cgroup v1と同様にmkdirコマンドを使います。
# mkdir /sys/fs/cgroup/test01 # ls /sys/fs/cgroup/test01 cgroup.controllers cgroup.events cgroup.procs cgroup.subtree_control
作成したcgroupの中のファイルを一覧してみると,cgroup.
というファイルです。これは前回紹介したcgroup v2の特徴のうち,
cgroupの削除
cgroupを作成する方法だけでなく,rmdir
コマンドで行います。上で作成した"test01"を削除してみましょう。
# rmdir /sys/fs/cgroup/test01/ # ls /sys/fs/cgroup/ cgroup.controllers cgroup.procs cgroup.subtree_control
cgroupにプロセスが所属しておらず,
cgroupへのプロセスの追加, 削除, 確認
使用するファイル
cgroup v1でタスクをcgroupに所属させる場合は,
表2 cgroupに所属するタスクに関連するファイル
ファイル名 | 表示されるID | cgroupのバージョン |
---|---|---|
tasks | スレッドID | v1のみ |
cgroup. |
プロセスID | v1, v2 |
- ※)
- 第3回での解説では紹介していませんでした。
プロセスの追加
cgroup v2ではプロセス単位で追加を行いますので,tasks
ファイルはありません。cgroup.
ファイルを使って登録や確認を行います。
プロセスを登録する操作はcgroup v1と同じです。プロセスをcgroupに登録してみましょう。さきほどの例で作成した"test01"グループに登録します。
# echo $$
3028
# echo $$ > /sys/fs/cgroup/test01/cgroup.procs
# cat /sys/fs/cgroup/test01/cgroup.procs
3028
3035(これはcatコマンドのPID)
cgroup.
にカレントシェルのPIDを書き込み,
プロセスの削除
プロセスの削除は,
# grep 3028 /sys/fs/cgroup/test01/cgroup.procs (test01に3028が所属している) 3028 # echo $$ > /sys/fs/cgroup/cgroup.procs (3028をrootに登録) # grep 3028 /sys/fs/cgroup/cgroup.procs (rootに登録されたことを確認) 3028 # grep 3028 /sys/fs/cgroup/test01/cgroup.procs (test01からは削除された) #
上の例のように,
プロセスが所属するcgroupの確認
プロセスが所属しているcgroupの情報は,/proc/[PID]/cgroup
にあります
cgroup v1では,
# cat /proc/12314/cgroup 15:debug:/ 14:rdma:/ 13:pids:/ 12:hugetlb:/ 11:net_prio:/ 10:perf_event:/ 9:net_cls:/ 8:freezer:/ 7:devices:/ 6:memory:/ 5:blkio:/ 4:cpuacct:/ 3:cpu:/test01 2:cpuset:/ 1:name=systemd:/
階層ごとに1行エントリが作成されます。各行はコロン区切りで
」
上の例だと,/test01
に属しており,
cgroup v2では,
# cat /proc/self/cgroup 0::/test01
階層はひとつしかありませんので1行で,0::
」
ちなみにv1とv2を共存させた場合,cgroup
ファイルの中身は次のようになります。
# cat /proc/self/cgroup 2:blkio,memory:/test01 1:cpu:/test01 0::/test01
cgroup v2は必ず"0"でエントリが始まり,