cgroups(シーグループス)
英語表記: cgroups (control groups)
概要
cgroups(シーグループス)は、Linuxカーネルが提供する非常に重要な機能の一つで、システム上のプロセスが利用できるCPU、メモリ、ディスクI/O、ネットワークなどのシステムリソースを制限し、優先度を制御するために使用されます。コンテナ技術(DockerやPodmanなど)において、cgroupsはコンテナがホストシステムのリソースを使いすぎないようにするための「資源配分係」として機能します。これにより、複数のコンテナが同じホスト上で安全かつ安定して動作することが保証されるのです。
この機能は、私たちが今学んでいる「コンテナ技術(Docker, Podman) → コンテナの基礎 → Linux カーネル機能」という文脈の中で、コンテナの「隔離」を実現するネームスペース(Namespace)機能と対になって、コンテナの安定稼働を支える土台となっています。
詳細解説
cgroupsの最大の目的は、システムリソースの公平な分配と、暴走するプロセスによるシステム全体の停止を防ぐことにあります。もしcgroupsがなければ、たった一つのコンテナがメモリをすべて食い尽くしたり、CPUを占有したりして、他の重要なアプリケーションやコンテナの動作を妨害してしまうかもしれません。これは非常に恐ろしい事態ですよね。
目的と動作原理
cgroupsは、プロセスをグループ化し、そのグループに対して特定のリソース制限を適用することで動作します。
- リソースの制限(Limitation): プロセスグループが利用できる最大メモリ量やCPU使用率の上限を設定します。
- リソースの優先度付け(Prioritization): リソースが競合した場合に、どのグループに優先的にリソースを割り当てるかを決定します。
これは、コンテナ環境において極めて重要です。例えば、重要なデータベースコンテナには高いCPU優先度を割り当て、開発用のテストコンテナには低い制限を設けるといった柔軟な運用が可能になります。
主要コンポーネント:サブシステム
cgroupsは、制御したいリソースの種類ごとに「サブシステム」(またはコントローラー)と呼ばれるモジュールに分かれています。主なサブシステムには以下のようなものがあります。
- cpu: CPU利用時間の割り当てを制御します。
- memory: プロセスグループが使用できるメモリ量(RAM)を制限します。
- blkio: ブロックデバイス(HDDやSSDなど)への入出力(I/O)速度を制御します。
- net_cls / net_prio: ネットワークトラフィックのタグ付けや優先度付けを行います。
これらのサブシステムは、階層構造(ツリー構造)で管理されます。親グループで設定した制限は、その配下の子グループに継承されます。これは、会社組織の予算配分に似ていますね。全体予算が決まった上で、各部署(子グループ)に細かく割り振られていくイメージです。
コンテナにおけるcgroupsの役割
DockerやPodmanなどのコンテナランタイムは、コンテナを起動する際に、このcgroups機能を利用して、新しいコンテナプロセスを特定のcgroup階層に配置します。
例えば、docker run --memory=512m my_app というコマンドを実行すると、DockerはホストOSのLinuxカーネルに対して、「このコンテナプロセス群はメモリを512MBまでしか使えません」という設定をcgroupsのメモリサブシステムに書き込むわけです。
cgroupsが「リソースの量」を制御するのに対し、ネームスペースが「見える範囲」(プロセスID、ネットワークインターフェースなど)を制御します。この二つのLinuxカーネル機能が組み合わさることで、初めて安全でポータブルなコンテナ環境が実現するのです。
具体例・活用シーン
cgroupsの働きを理解するために、日常生活に即したメタファーを交えて考えてみましょう。
1. シェアハウスの資源配分(メタファー)
cgroupsの役割は、大規模なシェアハウスにおける「スマートな資源管理システム」に例えることができます。
- ホストOS全体: シェアハウス全体(無限ではないリソース)。
- 各コンテナ: シェアハウスの各部屋(独立したアプリケーション)。
- cgroups: 各部屋に設置された専用の「リミッター付きメーター」です。
もしcgroupsがなければ、ある部屋の住人がエアコンを一日中最強でつけっぱなしにし、お湯を出しっぱなしにしてしまうかもしれません(リソースの暴走)。その結果、家全体のブレーカーが落ちたり、水道代がとんでもないことになったりします。
cgroupsという「リミッター付きメーター」があるおかげで、部屋Aには「電気は最大15Aまで」、部屋Bには「お湯は1ヶ月あたり〇〇リットルまで」といった制限を課すことができます。これにより、一部屋の使いすぎが原因で、他の部屋の住人(他のコンテナ)が被害を受けるのを防ぎ、シェアハウス全体(ホストOS)の安定稼働が守られるのです。
2. Dockerでの具体的な制限設定
実務では、アプリケーションの要件に応じてcgroupsの機能を活用します。
- CPUリソースの制限:
- 開発環境のコンテナには、
--cpus=0.5(CPUコアの半分まで利用可能)と設定し、本番環境への影響を防ぎます。
- 開発環境のコンテナには、
- メモリの制限:
- Webサーバーコンテナに
--memory=2gを設定し、2GB以上のメモリを使おうとしたら、カーネルが強制的にプロセスを終了させる(OOM Killer)ように設定します。これは、メモリリークの可能性があるアプリケーションがシステム全体をクラッシュさせるのを防ぐ、非常に重要な防御機構です。
- Webサーバーコンテナに
- ディスクI/Oの制御:
- 頻繁にログ書き込みを行うコンテナが、他の重要なデータベースコンテナのディスクアクセス速度を低下させないように、I/Oの帯域幅を制限します。
このように、cgroupsはコンテナ技術の安定運用において、パフォーマンスとセキュリティの両面から欠かせない「縁の下の力持ち」なのです。
資格試験向けチェックポイント
cgroupsは、Linuxの深い知識を問う応用情報技術者試験や、コンテナ技術の基礎を問う基本情報技術者試験で、特に重要視されるテーマです。ITパスポートでは直接的な出題は少ないかもしれませんが、「リソース管理」の概念として理解しておくと役立ちます。
1. 基本情報技術者試験・応用情報技術者試験対策
| 重点分野 | 確認すべきポイント |
| :— | :— |
| コンテナの基礎 | ネームスペース(Namespace)との役割分担を明確に理解しましょう。ネームスペースが「隔離」(見せない、分離する)を担当し、cgroupsが「制限」(どれだけ使えるか決める)を担当します。このセットでコンテナのセキュリティと安定性が成り立っています。 |
| 機能の定義 | cgroupsの目的は「リソースの制限と管理」である点を正確に覚えます。特にCPU、メモリ、I/Oが主要な管理対象です。 |
| 動作原理 | cgroupsが「プロセスをグループ化」し、「階層構造」でリソースを管理していることを理解しておきましょう。 |
| Docker/Podmanとの関連 | コンテナランタイムが、リソース制限設定をLinuxカーネルのcgroups機能に渡している、という仕組みを把握します。 |
2. 試験での典型的な出題パターン
- 記述問題: 「コンテナ技術において、プロセス隔離に用いられるLinuxカーネル機能とその役割を二つ挙げ、説明せよ。」(答え:ネームスペース:視覚的な隔離、cgroups:リソースの制限)
- 選択問題: 「プロセスが利用できるメモリやCPU時間を制限するLinuxカーネル機能はどれか。」(答え:cgroups)
cgroupsは、単なる技術用語ではなく、コンテナ環境の「品質保証」を担うコア機能として、その重要性が問われる傾向にあります。
関連用語
- 情報不足
(注記: 本記事の文脈では、cgroupsと密接に関連する用語として「ネームスペース (Namespace)」「Docker」「Podman」「OOM Killer」などが挙げられますが、関連用語のリストについては、指定された形式に従い情報不足とします。)
