はじめに
cgroups: リソースの上限を決める
namespace が「見える世界」を分けるのに対し、cgroups は CPU・メモリ・IO の使用量を制限する。`--cpus` や `--memory` が内部でやっていること。
cgroups が制限するもの
cgroups は「使える資源量」を決める仕組みです。
namespace と対になってコンテナの基盤を成します。
- CPU: シェア比率・クォータ(100ms あたり何 ms まで使えるか)
- メモリ: 最大使用量・OOM Killer の挙動
- IO: ブロックデバイスの帯域・IOPS
- プロセス数: fork 爆弾の封じ込め
docker run --cpus 1.5 --memory 512m のようなオプションは、内部的にこの cgroups の値を設定しています。
v1 と v2
cgroups には v1 と v2 があり、主要ディストロは v2 に移行済みです。
v2 では階層が統一され、systemd と連携しやすくなっています。
v1 はリソースごとに別ツリーを持ち柔軟でしたが、階層が分散して一貫した制御が難しい問題がありました。
v2 は単一ツリー上でコントローラを有効化するシンプルな設計です。
RHEL 9 系、Ubuntu 22.04 以降はデフォルトで v2 です。
bash
# cgroup v2 の確認
stat -fc %T /sys/fs/cgroup/
# 出力が "cgroup2fs" なら v2