Cgroups

cgroups (control groups) とは、プロセスグループのリソース(CPU、メモリ、ディスクI/Oなど)の利用を制限・隔離するLinuxカーネルの機能。"process containers" という名称で Rohit Seth が2006年9月から開発を開始し、2007年に cgroups と名称変更され、2008年1月に Linux カーネル 2.6.24 にマージされた。それ以来、多くの機能とコントローラが追加された。

機能 
設計目標の一つは、niceのように一つのプロセスをコントロールすることから OpenVZ や Linux-VServer のようにOSレベルで仮想化することまで、様々なユースケースを統一されたインターフェイスで提供することにある。

cgroups は以下の機能を提供している。

 リソース制限: グループのメモリ使用量を制限できる。これはファイルシステムキャッシュを含む。元々の論文は Containers: Challenges with the memory resource controller and its performance というタイトルで Linux シンポジウムで発表された。
 優先順位: いくつかのグループに、より大きな CPU やディスクI/Oスループットを割り振ったりできる。
 計上: あるシステムがどれだけのリソースを使用しているか計測する。課金用など。
 隔離: グループを他と切り離して異なる名前空間に置き、他のグループのプロセス・ネットワーク接続・ファイルが不可視になるようにする。
 コントロール: グループをフリーズしたり、チェックポイントしたり、再開したりできる。

利用法 
cgroups とは、同じ基準で集められたプロセスの集合である。グループは階層構造を持ち、それぞれのグループは親グループの制限を引き継ぐ。カーネルは複数のコントローラ（サブシステム）に cgroup のインターフェイスを通じてアクセスできる。例えば、メモリコントローラはメモリの使用を制限し、ns コントローラはプロセスを個別の名前空間に分離し、cpuacct はCPUの利用量を計算するなど。

cgroups は複数の方法で利用可能である。
 仮想ファイルシステムに手動で cgroups にアクセスする
 libcgroup で提供されている cgcreate, cgexec, cgclassify などのツールを使用し、作成・管理する
 ルールエンジンデーモンを使い、自動的に特定のユーザー・グループを移動させたり、設定に記述したとおりに cgroups に命令を出したりする。
 cgroups を利用する他のソフトウェア（例えば LXC や libvirt など）を通じて間接的に利用する。

名前空間の隔離 
技術的には cgroups の一部ではないが、関連する機能として、名前空間の隔離があり、グループ内のプロセスから他のグループのリソースを見えないようにすることができる。例えば、PID 名前空間を使うとそれぞれの名前空間ごとに重複したプロセス番号を割り振ることが可能になる。マウント、UTS、ネットワーク、SysV IPC などの名前空間が利用可能。もし、"ns" cgroup がマウントされている場合、それぞれの名前空間は cgroup 階層構造内で新しいグループを作る。

 PID 名前空間 - プロセス番号 (PID) の割り当て、プロセスの一覧とその詳細を隔離する。新しい名前空間は兄弟名前空間からは隔離されているが、親名前空間は子名前空間のプロセスを見ることができる。
 ネットワーク名前空間 - ネットワークインタフェース（物理または仮想）、iptables のファイアウォールのルール、ルーティングテーブルなどを分離する。ネットワーク名前空間は "veth" 仮想イーサーネットデバイスで相互につなげることができる。
 UTS 名前空間 - ホスト名を変更できる
 マウント名前空間 - 異なるファイルシステムレイアウトを作ったり、特定のマウントポイントを読み込み専用にできる。
 IPC 名前空間 - System V プロセス間通信を隔離する。
 ユーザー名前空間

名前空間は、unshare() や、clone() でフラグを設定することにより作ることができる。

関連項目 
 LXC

参照

外部リンク
 cgroups に関しての Linux カーネルドキュメント
 libcg

オープンソースソフトウェア
仮想化
Linux