cgroups(control groups)は、
Linuxカーネルに搭載された、プロセスグループのリソース利用を制限・隔離する機能です。
CPU、メモリ、ディスクI/Oなどのリソースを制御し、システムリソースの効率的な管理や
仮想化環境の構築に不可欠な役割を果たします。
歴史
cgroupsは、当初"process containers"という名称でRohit Seth氏によって2006年9月に開発が開始されました。その後、
2007年にcgroupsと改名され、2008年1月に
Linuxカーネル2.6.24にマージされました。それ以降、数多くの機能とコントローラが追加され、より強力で柔軟なリソース管理機能を提供するようになりました。
機能
cgroupsの設計目標は、単一プロセスの制御から、
OpenVZや
Linux-VServerのようなOSレベルでの
仮想化まで、幅広いユースケースに対応することです。統一されたインターフェースを通じて、様々なレベルでのリソース制御を可能にします。主な機能は以下の通りです。
リソース制限: グループごとのメモリ使用量(ファイルシステムキャッシュを含む)を制限できます。この機能に関する論文は「Containers: Challenges with the memory resource controller and its performance」というタイトルでLinuxシンポジウムで発表されました。
優先順位: 特定のグループに対して、
CPUやディスクI/Oスループットを優先的に割り当てることができます。これにより、重要なプロセスへのリソース配分を調整できます。
計上: 各グループが使用しているリソース量を計測できます。これにより、システムリソースの使用状況を把握し、課金などに利用できます。
隔離: グループを他のグループから切り離し、独立した名前空間に配置できます。これにより、プロセス、ネットワーク接続、ファイルなどが他のグループから見えなくなるため、セキュリティと安定性が向上します。
コントロール: グループを一時停止(フリーズ)、チェックポイント、再開することができます。これにより、リソースの動的な調整や管理が可能になります。
利用方法
cgroupsは、プロセスを特定の基準でグループ化したものです。グループは階層構造を持ち、各グループは親グループの制限を引き継ぎます。カーネルは、複数のコントローラ(サブシステム)を通じてcgroupのインターフェースにアクセスします。例えば、メモリコントローラはメモリ使用量を制限し、nsコントローラはプロセスを名前空間に分離し、cpuacctは
CPU使用量を計測します。
cgroupsは、以下の方法で利用できます。
1.
仮想ファイルシステムへの手動アクセス: cgroupファイルシステムを通して、手動でcgroupsを操作できます。
2.
libcgroupツールの利用: `cgcreate`, `cgexec`, `cgclassify`などのlibcgroupが提供するツールを使ってcgroupsを作成・管理できます。
3.
ルールエンジンデーモン: 特定のユーザーやグループを自動的に移動させたり、設定に基づいたcgroupsコマンドを実行できます。
4.
cgroupsを利用するソフトウェア経由: LXCやlibvirtなどの
ソフトウェアを通して、間接的にcgroupsを利用できます。
名前空間の隔離
名前空間の隔離は、技術的にはcgroupsの一部ではありませんが、密接に関連する機能です。グループ内のプロセスから他のグループのリソースを見えなくすることができます。例えば、PID名前空間を使うと、各名前空間で重複したプロセスIDを割り当てることが可能です。
利用可能な名前空間には、PID、マウント、UTS、ネットワーク、SysV IPCなどがあります。"ns" cgroupがマウントされている場合、各名前空間はcgroup階層内で新しいグループを作成します。
PID名前空間: プロセスIDの割り当て、プロセスの一覧とその詳細を隔離します。新しい名前空間は兄弟名前空間からは隔離されますが、親名前空間は子名前空間のプロセスを見ることができます。
ネットワーク名前空間: ネットワークインターフェース、iptablesファイアウォールルール、ルーティングテーブルなどを分離します。ネットワーク名前空間は、"veth"仮想イーサネットデバイスで相互に接続できます。
UTS名前空間: ホスト名を変更できます。
マウント名前空間: 異なるファイルシステムレイアウトを作成したり、特定のマウントポイントを読み取り専用にできます。
IPC名前空間: System Vプロセス間通信を隔離します。
ユーザー名前空間: ユーザーとグループのIDを名前空間内で
仮想化します。
名前空間は、`unshare()`や`clone()`システムコールでフラグを設定することにより作成できます。
関連項目
LXC
参考資料
cgroupsに関するLinuxカーネルドキュメント
libcg