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 ^ Jonathan Corbet (2007年5月29日). “Process containers”. LWN.net. http://lwn.net/Articles/236038/  ^ a b c Jonathan Corbet (2007年10月29日). “Notes from a container”. LWN.net. http://lwn.net/Articles/256389/  ^ Jonathan Corbet (2007年7月31日). “Controlling memory use in containers”. LWN. http://lwn.net/Articles/243795/  ^ Balbir Singh, Vaidynathan Srinivasan (July 2007). Ottawa Linux Symposium. http://www.kernel.org/doc/ols/2007/ols2007v2-pages-209-222.pdf  ^ Jonathan Corbet (2007年10月23日). “Kernel space: Fair user scheduling for Linux”. Network World. http://www.linuxworld.com/news/2007/101207-kernel.html  ^ Kamkamezawa Hiroyu (19 November 2008). Cgroup and Memory Resource Controller (PDF presentation slides). Japan Linux Symposium. ^ a b Dave Hansen. Resource Management (PDF presentation slides). Linux Foundation. ^ Matt Helsley (2009年2月3日). “LXC: Linux container tools”. IBM developerWorks. http://www.ibm.com/developerworks/linux/library/l-lxc-containers/  ^ Pavel Emelyanov, Kir Kolyshkin (2007年11月19日). “PID namespaces in the 2.6.24 kernel”. LWN.net. http://lwn.net/Articles/259217/  ^ Jonathan Corbet (2007年1月30日). “Network namespaces”. LWN.net. http://lwn.net/Articles/219794/  ^ Serge E. Hallyn, Ram Pai (2007年9月17日). “Applying mount namespaces”. IBM developerWorks. http://www.ibm.com/developerworks/linux/library/l-mount-namespaces.html  ^ Janak Desai (2006年1月11日). “Linux kernel documentation on unshare”. 2011年10月21日閲覧。 cgroups に関しての Linux カーネルドキュメント libcg