Dock Stay
cgroups(v1 / v2) - cgroups の使い方・オプション・サンプル

cgroups(v1 / v2) - cgroups

cgroups(Control Groups)はプロセス群の CPU・メモリ・IO などのリソース使用量を制限・計測する Linux カーネルの仕組み。namespace と対になってコンテナの基盤を成す。

概念図

cgroups diagram

構文

bash

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 で殺されますが、ホスト側の他プロセスには影響しません。

これが「コンテナを安全に同居させる」基盤になっています。

関連トピック