Linux Kernel 4.5+ で標準化された Control Groups の v2 仕様。CPU / メモリ / I/O / PIDS / ネットワーク等のリソース制限を統一階層 + 簡素化された API で管理、systemd v245+ + Docker / Kubernetes 等のコンテナで活用。
cgroup v2(シーグループ ブイツー、Control Groups version 2)は、Linux Kernel 4.5(2016 年 3 月)で標準化された Control Groups の v2 仕様です。Tejun Heo(テジュン・ヘオ、Linux Kernel cgroup メンテナ、Facebook 在籍)が中心となって 2014-2016 年に設計 + 実装しました。
技術背景は、(1)Linux Kernel 2.6.24(2008 年 1 月)で cgroup v1 が導入、Google が Borg(後年 Kubernetes の祖先)で活用してきた CPU / メモリ / I/O / PIDS / ネットワーク等のリソース制限機能・(2)cgroup v1 は各サブシステムが独立した階層構造(/sys/fs/cgroup/cpu / memory / pids / blkio 等)で複雑性 + 冗長性 + 階層間の不整合が問題・(3)Docker / Kubernetes / systemd 等の現代コンテナ + Init システムの要件に対応するため、Tejun Heo が cgroup v2 設計を 2014 年から開始、2016 年に Linux Kernel 4.5 で公式リリース、です。
主要改善点は、(1)統一階層(Single Unified Hierarchy、すべてのサブシステムを 1 つの階層 /sys/fs/cgroup/ で管理)・(2)簡素化された API + 明確なセマンティクス(各 cgroup ファイルの役割と動作が一貫)・(3)正確なメモリ制限(memory.max が hard limit、memory.high が soft limit、OOM Killer 動作の改善)・(4)正確な I/O 制限(io.max + io.weight の Block I/O Throttling)・(5)PIDS / RDMA / DMA / HugeTLB / Misc 等の新しいコントローラ追加・(6)Pressure Stall Information(PSI、CPU / メモリ / I/O のリソース不足を時間的に測定、kernel 4.20+ から提供)、です。
実装の特徴は、(1)mount -t cgroup2 cgroup2 /sys/fs/cgroup(v2 マウントポイント)・(2)cgroup.controllers ファイルで利用可能なコントローラ確認・(3)cgroup.subtree_control ファイルで子 cgroup に渡すコントローラ指定・(4)CPU 制限例: echo "100000 100000" > cpu.max(100% CPU 制限)・(5)メモリ制限例: echo "1G" > memory.max(1GB ハードリミット)・(6)PSI 監視例: cat memory.pressure(メモリ圧迫時間)、というシンプルな API です。
主要採用は、(1)systemd v245+(2020 年 3 月、cgroup v2 ハイブリッドモード → 完全 v2 切替)・(2)Docker 20.10+(2021 年、デフォルト cgroup v2 対応)・(3)Kubernetes 1.25+(2022 年 8 月、cgroup v2 ベータ → GA)・(4)Podman / containerd / CRI-O / runc 等のコンテナランタイム・(5)主要 Linux ディストリビューション(Ubuntu 22.04+ / Fedora 31+ / Debian 11+ / RHEL 9+ / Arch Linux / openSUSE Tumbleweed / Pop!_OS 22.04+)、です。
cgroup v2 の主な利点は、(1)正確なリソース制限 + OOM 動作改善・(2)PSI による正確な負荷測定・(3)コンテナランタイム + systemd 統合の簡素化・(4)将来的な Linux Kernel 機能拡張の基盤、で、現代の Linux コンテナ環境の基盤技術として 2020-2026 年に主流化、cgroup v1 は段階的にレガシー化が進んでいます。
| 項目 | cgroup v1 | cgroup v2 |
|---|---|---|
| 階層構造 | サブシステムごとに独立階層 | 統一階層 |
| API 一貫性 | 各サブシステムごと独自 | 統一 + シンプル |
| メモリ制限 | memory.limit_in_bytes(精度低) |
| memory.max(精度高) |
| I/O 制限 | blkio(複雑) | io(シンプル) |
| PSI | なし | あり(4.20+) |
| 主要採用 | レガシー | 現代主流 |
cgroup v2 は最新の主要 Linux ディストリビューション(Ubuntu 22.04+ / Fedora 31+ / Debian 11+ / Arch Linux / Pop!_OS 22.04+)で標準有効化されており、ホビー Linux ユーザー + 自宅サーバ + Kubernetes 環境で日常的に恩恵を受けています。Docker / Podman / Kubernetes のリソース制限がより正確に動作 + OOM Killer の動作改善 + PSI による正確な負荷測定が可能です。
ホビー / 業務知識習得用途では、cat /proc/cgroups で利用可能サブシステム + mount | grep cgroup で v1 / v2 確認 + cd /sys/fs/cgroup && ls で階層構造観察、echo "1G" > /sys/fs/cgroup/myapp/memory.max で実際にメモリ制限設定 + cat /sys/fs/cgroup/myapp/memory.pressure で PSI 監視、などの学習が有用です。Kubernetes リソース制限 + コンテナ運用の理解に直接役立ちます。
Q1: cgroup v1 と v2 どちらを使うべきですか? A: 2024-2026 年現在は v2 が推奨です。systemd / Docker / Kubernetes 等の主要ツールが v2 を標準化しており、新規環境では v2 のみを使うのが普通です。レガシー Linux カーネル + 一部のレガシーアプリ(Hadoop / Spark の古いバージョン等)では v1 が必要なケースもあるため、ハイブリッドモード対応も可能です。
Q2: PSI(Pressure Stall Information)は何が便利ですか? A: CPU / メモリ / I/O が不足している時間を正確に測定できる機能で、リソース不足の早期検知 + 自動スケーリング判断 + 負荷モニタリングに極めて有用です。Kubernetes Vertical Pod Autoscaler + Horizontal Pod Autoscaler が PSI を活用してより正確なスケーリング判断を行います。
Q3: 自宅 Linux で cgroup v2 を試す方法は?
A: 最新ディストリビューション(Ubuntu 22.04+ / Fedora 31+ 等)では既に標準有効化されています。mount | grep cgroup2(v2 マウントポイント確認)+ ls /sys/fs/cgroup(階層観察)+ Docker / Podman でコンテナ起動 + cat /sys/fs/cgroup/system.slice/docker-<container>.scope/memory.current(コンテナのメモリ使用量)で実機学習できます。