Ubuntuの次の長期サポート版のリリースが近づいています。それに合わせて,
さて,
今回も引き続き,
まずは,
なお,
今回の実行例は,
子cgroupを持つ場合の制約
第37回で紹介したように,
この動きを紹介しましょう。
プロセスが所属した状態で子cgroupで使うコントローラを登録しようとした場合の動き
まずはroot cgroupで,
# echo "+io +memory +pids" > /sys/fs/cgroup/cgroup.subtree_control(子cgroupで使えるコントローラの登録)
上のようにio,
# mkdir /sys/fs/cgroup/test01(test01 cgroupの作成) # cat /sys/fs/cgroup/test01/cgroup.controllers(test01で使えるコントローラの確認) io memory pids
test01
cgroupを作成すると,
このtest01
にプロセスを登録してみましょう
# echo $$ > /sys/fs/cgroup/test01/cgroup.procs(プロセスの追加) # cat /sys/fs/cgroup/test01/cgroup.procs(追加したプロセスの確認) 3129 3139
無事に登録できましたね。ここまではこれまで紹介してきたcgroup v2で行う操作と同じです。
この状態で,test01
の子cgroupで使うコントローラをcgroup.
ファイルに登録してみましょう。
# echo "+io +memory +pids" > /sys/fs/cgroup/test01/cgroup.subtree_control bash: echo: write error: Device or resource busy
エラーになりました
このように,
それでは,test01
にプロセスが所属しない状態にして,
# echo $$ > /sys/fs/cgroup/cgroup.procs(プロセスをrootに登録しtest01から削除) # cat /sys/fs/cgroup/test01/cgroup.procs(test01にはプロセスがない状態)
test01
に登録したプロセスをroot cgroupに移動させました
この状態で先ほどと同様にtest01
に,
# echo "+io +memory +pids" > /sys/fs/cgroup/test01/cgroup.subtree_control(登録してもエラーはでない) # cat /sys/fs/cgroup/test01/cgroup.subtree_control(コントローラは登録されている) io memory pids
無事,cgroup.
ファイルにコントローラが登録できました
ここまでで,
子cgroupで使えるコントローラを登録した状態でプロセスを登録しようとした場合の動き
次は,
先ほどの例で作成したtest01
に子cgroupを作ってみましょう。test01
のcgroup.
ファイルには,
# mkdir /sys/fs/cgroup/test01/test02(test02の作成) # cat /sys/fs/cgroup/test01/test02/cgroup.controllers (test02ではtest01で登録したコントローラが使えるようになっている) io memory pids
test02
という名前のcgroupを作りました。test02
で使えるコントローラを確認すると,test01
のcgroup.
で設定したコントローラが表示されています
つまりtest01
cgroupは子孫にリソースを分配している状態です。
この状態で,test01
にプロセスを登録してみます。
# echo $$ > /sys/fs/cgroup/test01/cgroup.procs bash: echo: write error: Device or resource busy
プロセスを登録しようとすると,test01
は子孫にリソースを分配しているからです。
ここまでの実行例で,
- 自身にプロセスが登録された状態で,
子cgroupに対してコントローラが使えるように設定しようとするとエラーになる - 子cgroupに対してコントローラが使えるように設定した状態で,
自身にプロセスを登録しようとするとエラーになる
第37回で紹介したとおり,
子cgroupで使えるコントローラを登録していない場合の動き
それでは,cgroup.
にコントローラが登録されていない状態)
確認してみましょう。
# cat /sys/fs/cgroup/test01/cgroup.subtree_control(test01では子孫用にコントローラ登録なし)
このように,test01
ではcgroup.
は空で,test01
の子cgroup test02
にプロセスを登録します。
# echo 3129 > /sys/fs/cgroup/test01/test02/cgroup.procs(test01/test02にプロセスを登録) # cat /sys/fs/cgroup/test01/test02/cgroup.procs(test02に登録されている) 3129
子cgroupであるtest02
にプロセスが登録された状態で,test01
にプロセスを登録してみましょう。
# echo 3108 > /sys/fs/cgroup/test01/cgroup.procs(test01にもプロセスを登録) # cat /sys/fs/cgroup/test01/cgroup.procs(エラーなく登録されている) 3108
上の実行例のように,
まとめると,
- 自身にプロセスが所属していないときだけ,
子孫にリソースを分配できる (子でコントローラが使えるように設定できる) - コントローラによるリソース制御を行わない場合は,
ツリー末端以外の任意のcgroupにもプロセスが所属できる
という制約がcgroup v2には存在します。ただし,
- root cgroupには以上の制約はない
となります。