cgroups(v1 / v2) - cgroups
cgroups(Control Groups)はプロセス群の CPU・メモリ・IO などのリソース使用量を制限・計測する Linux カーネルの仕組み。namespace と対になってコンテナの基盤を成す。
概念図
構文
cgroups とは
cgroups は、プロセスをグループにまとめ、そのグループに対して「CPU は 1 コアまで」「メモリは 512 MiB まで」といった上限を設定したり、使用量を計測したりするカーネル機能です。
namespace が「見える世界」を分ける仕組みだとすれば、cgroups は「使える資源量」を決める仕組みと言えます。
コンテナランタイムはコンテナ起動時にそのコンテナ専用の cgroup を作成し、コンテナ内の全プロセスをそこに所属させます。
これにより、1 つのコンテナが暴走してもホスト全体を巻き込まないようにできます。
v1 と v2 の違い
cgroups v1 はリソースごとに別々の階層ツリーを持ち(CPU 用ツリー、メモリ用ツリーなど)、プロセスはそれぞれに別々に所属していました。
設定は柔軟でしたが、階層が複数あるために一貫した制御が難しい問題がありました。
v2 では階層が 1 本に統一され、同じツリー上でリソースコントローラが差し込まれるシンプルな設計になっています。
v2 は systemd・Kubernetes・新しめの Docker が推奨しており、最近の主要ディストリビューション(RHEL 9 系、Ubuntu 22.04 以降など)はデフォルトで v2 に移行しています。
| 項目 | v1 | v2 |
|---|---|---|
| 階層 | リソースごとに別ツリー | 単一の統一ツリー |
| プロセス所属 | 複数ツリーに同時 | 1 つのノードに所属 |
| 設計思想 | 細かい柔軟性 | 一貫性と単純さ |
| 主な採用 | レガシー環境 | 最新ディストリのデフォルト |
Docker での設定(--memory 等)
Docker / Podman の CLI オプションは、最終的にコンテナ用 cgroup の設定値に変換されます。
代表的なフラグは次の通りです。
| フラグ | 意味 | 例 |
|---|---|---|
--memory |
メモリ上限 | --memory=512m |
--memory-swap |
メモリ + スワップの合計上限 | --memory-swap=1g |
--cpus |
CPU コア数換算の上限 | --cpus=1.5 |
--cpu-shares |
相対的な CPU 配分比率 | --cpu-shares=512 |
--blkio-weight |
ブロック IO の相対重み | --blkio-weight=300 |
docker run --rm --memory=256m --cpus=0.5 nginx:alpine
--memory を超えた場合、コンテナ内プロセスは OOM Killer で殺されますが、ホスト側の他プロセスには影響しません。
これが「コンテナを安全に同居させる」基盤になっています。
関連トピック
linux namespaces- Linux Namespaces はプロセスごとに「見える世界」を分離する仕組み。PID・Mount・Network・UTS・IPC・User・cgroup の 7 種があり、コンテナのプロセス隔離の中核を担う。 OCI spec- OCI はコンテナのイメージ・実行・配布形式を標準化する業界団体。Image Spec / Runtime Spec / Distribution Spec の 3 本柱で、Docker・Podman・containerd などが同じ成果物を扱える。 container vs VM- コンテナと VM はどちらもワークロードを隔離する技術だが、カーネル共有の有無で性能・密度・隔離強度が大きく変わる。用途ごとに使い分ける。 