前回の記事は、
今年は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内に現れるファイルのうち、
ファイル名 | 説明 |
---|---|
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に所属させる場合は、
ファイル名 | 表示される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"でエントリが始まり、
サブシステム(コントローラ)の制御
cgroup.controllersファイル
各cgroupにはcgroup.
というファイルがあり、
# ls /sys/fs/cgroup/ cgroup.controllers cgroup.procs cgroup.subtree_control # cat /sys/fs/cgroup/cgroup.controllers io memory pids rdma
上の実行例ではroot cgroupのcgroup.
ファイルを見ています。つまり、
前回説明したように、

図1は前回のサブシステム制御の解説部分で図2として載せた図を、cgroup.
ファイルは、
cgroup.subtree_controlファイル
それでは、cgroup.
というファイルです。
このファイルは、
# mount -t cgroup2 cgroup2 /sys/fs/cgroup/
# cat /sys/fs/cgroup/cgroup.controllers
io memory pids rdma
# cat /sys/fs/cgroup/cgroup.subtree_control (マウント直後のcgroup.subtree_controlファイルは空)
#
このファイルに、cgroup.
ファイルに一覧されているサブシステムのうち、
この有効にしたり、
子cgroupで使えるサブシステムの登録と削除は、cgroup.
ファイルに書き込むことで行います。
- サブシステムを子cgroupで使えるように有効化するには、
サブシステム名の前に"+"をつける - 子cgroupで有効化されているサブシステムを削除するには、
サブシステム名の前に"-" (マイナス) をつける
また、
- 複数のサブシステムをスペース区切りで書けば、
一度で有効化、 無効化できる - 複数回、
サブシステムを登録、 削除する文字列を書き込めば、 複数のサブシステムを有効化、 無効化できる
それでは実際にサブシステムが子cgroupで使えるように、
サブシステムの登録
まずはrootで使えるサブシステムのすべてを子cgroupで使えるように登録してみます。
# echo "+io +memory +pids" > /sys/fs/cgroup/cgroup.subtree_control (io, memory, pidsを有効化) # echo "+rdma" > /sys/fs/cgroup/cgroup.subtree_control (rdmaを有効化) # cat /sys/fs/cgroup/cgroup.subtree_control (子cgroupで使えるサブシステムの確認) io memory pids rdma
上の例では、
サブシステムの削除
この後、cgroup.
ファイルに書き込みます。
# cat cgroup.subtree_control (4つサブシステムが登録されている) io memory pids rdma # echo "-rdma" > cgroup.subtree_control (rdmaを削除) # cat cgroup.subtree_control (rdmaが削除されている) io memory pids
子cgroupでのサブシステムの確認
では、cgroup.
ファイルで、cgroup.
ファイルには登録したサブシステムが現れているはずです。
# cat /sys/fs/cgroup/cgroup.subtree_control (子cgroupで使えるサブシステムの確認) io memory pids # mkdir /sys/fs/cgroup/test01 (子cgroupとしてtest01 cgroupを作成) # cat /sys/fs/cgroup/test01/cgroup.controllers (test01で使えるサブシステムを確認) io memory pids # echo "+rdma" > cgroup.subtree_control (親cgroupで子cgroupで使えるサブシステムを追加) # cat /sys/fs/cgroup/test01/cgroup.controllers (追加したサブシステムが子cgroupで追加されている) io memory pids rdma # echo "-rdma" > cgroup.subtree_control (子cgroupで使えるサブシステムを削除) # cat /sys/fs/cgroup/test01/cgroup.controllers (子cgroupから削除したサブシステムが削除されている) io memory pids
上の例では、
- 親cgroupの
cgroup.
で指定したサブシステムが、subtree_ control 子cgroup ("test01") 内の cgroup.
ファイルに出現しているcontrollers - 親cgroupの
cgroup.
で追加、subtree_ control 削除したサブシステムが、 子cgroup内 cgroup.
に現れたり消えたりしているcontrollers
ことが確認できます。
上の例では"test01" cgroupのcgroup.
ファイルで有効になっているサブシステムを確認しました。もちろん、
# ls /sys/fs/cgroup/test01/ (cgroupコア用ファイルの他にio,memory,pid用のファイルが出現している)
cgroup.controllers io.stat memory.max pids.events
cgroup.events memory.current memory.stat pids.max
cgroup.procs memory.events memory.swap.current
cgroup.subtree_control memory.high memory.swap.max
io.max memory.low pids.current
親cgroupでサブシステムを有効すると同時に、
このように、cgroup.
ファイルに存在するサブシステムをcgroup.
に登録して、
トップダウン制約
次に、
まずは、
# mkdir /sys/fs/cgroup/test01/test0{2,3} (test01の子cgroupとしてtest02,test03を作成) # echo "+memory" > /sys/fs/cgroup/test01/cgroup.subtree_control (test01の子cgroupではmemoryサブシステムのみ使用できるように設定) # cat /sys/fs/cgroup/test01/cgroup.subtree_control (設定の確認) memory # cat /sys/fs/cgroup/test01/test02/cgroup.controllers (子cgroupではmemoryサブシステムのみ使用可能) memory # cat /sys/fs/cgroup/test01/test03/cgroup.controllers memory
上のように"test01" cgroupの子cgroupとして"test02"、cgroup.
ファイルに+memory
と書き込み、
ここでroot cgroupで、
# echo "+rdma" > /sys/fs/cgroup/test01/test02/cgroup.subtree_control bash: echo: write error: No such file or directory # echo "+rdma" > /sys/fs/cgroup/test01/cgroup.subtree_control bash: echo: write error: No such file or directory
このように、cgroup.
ファイルに登録しようとするとエラーになります。
上位のcgroupからサブシステムが使えるように設定されていない限りは、
まとめ
冒頭で書いたように、
次回以降で、