第1章 コントロールグループについて (cgroup)

Red Hat Enterprise Linux 6 では、コントロールグループ と呼ばれる新たなカーネル機能を搭載しています。本ガイドでは、この機能を cgroup という略称で記載しています。cgroup により、ユーザーは、CPU 時間、システムメモリー、ネットワーク帯域幅などのリソースやそれらのリソースの組み合わせを、システム上で実行中のユーザー定義タスクグループ (プロセス) の間で割り当てることができるようになります。また、設定した cgroup のモニタリングを行ったり、特定のリソースに対する cgroup のアクセスを拒否することができるのに加えて、稼働中のシステムで cgroup を動的に再設定することもできます。cgconfig (control group config) サービスがブート時に起動し、事前に定義された cgroup を再構築するように設定して、再起動後も永続されるようにすることが可能です。
cgroup を使用することにより、システム管理者は、システムリソースの割り当て、優先度設定、拒否、管理、モニタリングに対する粒度の細かいコントロールが可能となります。ハードウェアリソースは、タスクおよびユーザー間で素早く分配され、全体的な効率が向上します。

1.1. コントロールグループの構成

プロセスと同様に、cgroup は階層的に構成されており、子 cgroup は、親 cgroup の属性の一部を継承するようになっています。ただし、これら 2 つのモデルの間には相異点があります。

Linux プロセスモデル

Linux システム上のプロセスはすべて、init プロセスという、共通の親プロセスの子プロセスです。init プロセスは、ブート時にカーネルによって実行され、その他のプロセスを開始します (その結果、その他のプロセスがそれら独自の子プロセスを開始する場合もあります)。プロセスはすべて、単一の親プロセスの下位プロセスであるため、Linux プロセスモデルは、単一の階層またはツリーとなっています。
また、init を除いた Linux プロセスはすべて、環境 (例: PATH 変数)[1] および親プロセスのその他特定の属性 (例: オープンファイル記述子) を継承します。

cgroup モデル

cgroup は、以下のような点でプロセスと類似しています:
  • 階層型である
  • 子 cgroup は、親 cgroup から特定の属性を継承する
根本的な相違点は、cgroup の場合には、多数の異なる階層がシステム上に同時に存在可能であることです。Linux プロセスモデルが単一のプロセスツリーとすれば、cgroup モデルは、単一もしくは複数の分離した、連結されていないタスクツリー (すなわちプロセス)ということになります。
cgroups の複数の分離した階層が必要なのは、各階層が 単一または複数の サブシステム に接続されていることが理由です。サブシステム[2] とは、CPU 時間やメモリーなどの単一のリソースを指します。Red Hat Enterprise Linux 6 は、10 の cgroup サブシステムを提供しています。それらの名前と機能は、以下のとおりです。

Red Hat Enterprise Linux で利用可能なサブシステム

  • blkio — このサブシステムは、物理ドライブ (例: ディスク、ソリッドステート、USB) などのブロックデバイスの入出力アクセスの制限を設定します。
  • cpu — このサブシステムは、スケジューラーを使用して cgroup タスクに CPU へのアクセスを提供します。
  • cpuacct — このサブシステムは、cgroup 内のタスクで使用される CPU リソースについての自動レポートを生成します。
  • cpuset — このサブシステムは、個別の CPU (マルチコアシステム上) およびメモリーノードを cgroup 内のタスクに割り当てます。
  • devices — このサブシステムは、cgroup 内のタスクによるデバイスへのアクセスを許可または拒否します。
  • freezer — このサブシステムは、cgroup 内のタスクを一時停止または再開します。
  • memory — このサブシステムは、cgroup 内のタスクによって使用されるメモリーに対する制限を設定し、それらのタスクによって使用されるメモリーリソースについての自動レポートを生成します。
  • net_cls — このサブシステムは、Linux トラフィックコントローラー (tc) が特定の cgroup から発信されるパケットを識別できるようにするクラス識別子 (classid) を使用して、ネットワークパケットにタグを付けます。
  • net_prio — このサブシステムは、ネットワークインターフェース別にネットワークトラフィックの優先度を動的に設定する方法を提供します。
  • nsnamespace サブシステム。

サブシステムは、リソースコントローラーという別名でも知られています

man ページやカーネルのドキュメントなど、cgroup に関連した資料で リソースコントローラー または単に コントローラー という用語が使用されている場合があります。これらの 2 つの用語は、サブシステムと同じ意味です。これは、サブシステムが通常リソースのスケジュールを行ったり、サブシステムが接続されている階層内の cgroups に対する制限を適用したりすることが理由で、このように呼ばれています。
サブシステム (リソースコントローラー) の定義は、極めて広義で、タスクグループ (すなわちプロセス) に作用するものとされています。


[1] 親プロセスは、子プロセスに環境を受け渡す前にその環境を変更することが可能です。
[2] libcgroup の man ページおよびその他のドキュメントでは、サブシステムが リソースコントローラー もしくは単に コントローラー とも呼ばれることを認識しておく必要があります。