LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術

第3回 Linuxカーネルのコンテナ機能[2] ─cgroupとは?(その1)

この記事を読むのに必要な時間:およそ 4 分

cgroupの階層構造

さて,ここまでの例では自分で作成したcgroupへプロセスを登録したり,移動させたりしました。それでは,自分の作成したcgroupからプロセスを削除したい場合はどうするのでしょうか? それを説明するには,cgroupの特徴をもうひとつ学ぶ必要がありますので説明していきましょう。

先にmountコマンドを使って/sys/fs/cgroup/cpuにcgroupfsをマウントしました。このcgroupfsのトップディレクトリにも作成したcgroupと同じようにいろいろなファイルができていました。この/sys/fs/cgroup/cpuにあるtaskファイルの中身を見てみましょう。

 $ cat /sys/fs/cgroup/cpu/tasks
 1
 2
 3
 5
   :(略)

PID 1を先頭に,ずらっとPIDが並んでいると思います。cgroupfsをマウントすると,まずはシステム上の全てのプロセスがここに登録されます。つまりシステム全体のデフォルトのcgroupのような扱いですね。

新たにcgroupを作成してプロセスを登録すると,先に説明したようにプロセスがcgroup間を移動しますので,/sys/fs/cgroup/cpu/tasksからはそのPIDが消えることになります。逆に,自分で作成したcgroupからプロセスを削除したい場合は,このトップディレクトリのtasksにPIDを登録して移動させます。削除というよりは,デフォルトの状態に戻すことになりますね。つまり,cgroupfsがマウントされるとプロセスは必ずどこかのcgroupに属していることになります。

さて,ここまではトップディレクトリ直下にcgroupを作成していました。トップディレクトリだけでなく,通常のディレクトリと同様に自分で作ったcgroupの下にさらにcgroupを作ることもできます。

先ほど作成したtest02グループの下にtest03グループを作ってみましょう。

 $ sudo mkdir /sys/fs/cgroup/cpu/test02/test03
 $ ls /sys/fs/cgroup/cpu/test02/test03
 cgroup.clone_children  cpu.cfs_period_us  cpu.rt_runtime_us  notify_on_release
 cgroup.event_control   cpu.cfs_quota_us   cpu.shares         tasks
 cgroup.procs           cpu.rt_period_us   cpu.stat

今までと全く同じようにディレクトリが作成され,中にいろいろなファイルができています。

ここまで見てきたように,通常のファイルシステムに階層構造でディレクトリと作るのと同じようにcgroupを作れます。cgroupfsのトップディレクトリをルートにした階層構造です。この階層構造のサポートがcgroupのもうひとつの特徴です

この階層構造を使ってプロセスをグループ化して管理できます。たとえば,図1のようにcgroupを作成し,それぞれのグループにCPUを割り当てるといったことが可能です。

図1 cgroupの階層構造の例

図1 cgroupの階層構造の例

この図では,⁠デスクトップアプリ」「デーモン」グループにそれぞれ30%ずつCPUを割り当てていますので,そのさらに下のcgroupは親の割り当てである30%からリソースが割り当てられます。⁠ブラウザ」⁠⁠エディタ」グループに親である「デスクトップアプリ」グループに割り当てられたリソースの半分ずつを割り当てると,それぞれ15%が割り当てられます。

この例のようにcgroupの親子関係の間では,子のcgroupは親のcgroupの制限を受けます。絶対値で制限を設定するような場合,子のcgroupで親のcgroupの制限を超えるような設定を行っても,先に親のcgroupの制限に引っかかりますので意味がありません。

cgroupが管理するどのようなリソースでも階層構造を使用できます。しかし,リソースの種類によっては階層構造を使用する意味のないリソースもあります。


以上のようにcgroupを操作することにより,プロセスをグループ化して扱うことができます。cgroupの機能を使って,コンテナ内のプロセスを同じcgroupに入れて,コンテナのリソースに対する操作を一元的に行えるわけです。

まとめ

以上のようにcgroupを操作することにより,プロセスをグループ化して扱うことができます。cgroupの機能を使って,コンテナ内のプロセスを同じcgroupに入れて,コンテナのリソースに対する操作を一元的に行えるわけです。

さて,今回でcgroupの説明を終える予定でしたが,少し長くなりそうなので今回はここまでにしておきます。今回出てきたcgroupの特徴をまとめておきます。

  • cgroupはcgroupfsという特別なファイルシステムで管理する
  • cgroup はディレクトリで表される
  • cgroupfsをマウントするとデフォルトでは全てのプロセスがトップディレクトリのグループにデフォルトで登録される
  • 子プロセスはデフォルトでは親のプロセスと同じcgroupに属する
  • cgroupは階層構造を取り,グループ間の親子関係を構成できる
  • システム上のプロセスは必ずcgroupfsのトップディレクトリ以下のcgroupのどれか1つだけに属する

ここまででプロセスをどうグループ化して管理するかの説明ができましたので,次回はcgroupを使ってどのようなリソースを管理できるのかを説明していきたいと思います。

著者プロフィール

加藤泰文(かとうやすふみ)

2009年頃にLinuxカーネルのcgroup機能に興味を持って以来,Linuxのコンテナ関連の最新情報を追っかけたり,コンテナの勉強会を開いたりして勉強しています。英語力のない自分用にLXCのmanページを日本語訳していたところ,あっさり本家にマージされてしまい,それ以来日本語訳のパッチを送り続けています。

Plamo Linuxメンテナ。ファーストサーバ株式会社所属。

Twitter:@ten_forward
技術系のブログ:http://tenforward.hatenablog.com/

コメント

コメントの記入