このページの目次
cgroup
カバー範囲: cgroup v2 の統一階層 → コントローラ (cpu/memory/io/pids/cpuset) → cgroupfs → メモリリクライム → PSI → cgroup プログラミングモデル カーネルバージョン: 2.6 (v1) ~ 6.x (v2)
概要
cgroup (control group) は、プロセスのリソース使用制限、優先度制御、および統計情報を提供します。v2 は v1 の複数の独立した階層を 1 つの木構造に統合し、コントローラ間の調整が不可能だった根本的な問題を解決しました。
cgroup v2 vs v1
cgroup v1:
各コントローラに独立した階層がある → CPU と memory の制御ツリーが異なる可能性がある
→ 「この cgroup 内で CPU と memory の上限が一緒に機能する」という表現ができない
cgroup v2 (4.5 以降、現在のデフォルト):
単一の統一階層 → すべてのコントローラが同じ木構造を共有
→ 1 つの cgroup ディレクトリ内ですべてのコントローラのパラメータを設定可能
→ コントローラ間の調整が可能になる (例: memory pressure → IO スロージング)
cgroupfs インターフェース
# マウント
# cgroup の作成
# → 親レベルのコントローラ設定を自動的に継承
# プロセスの移動
# プロセスが属する cgroup の確認
コントローラの詳細
cpu
# ウェイト (スケジューリング優先度, デフォルト 100):
# バンド幅制限:
memory
# メモリプレッシャー通知 (PSI):
io
# ウェイト:
# バンド幅制限:
pids
cpuset
# CPU/メモリノードの固定:
メモリリクライムの詳細
mm/memcontrol.c— cgroup メモリコントローラのカーネルパス:
PSI (Pressure Stall Information)
# /proc/pressure/ — 3段階の圧力指標:
# some: 少なくとも1つのタスクが待機中 → リソース競合
# full: idle 以外の全タスクが待機中 → リソースの完全な飽和
プログラミングインターフェース (カーネル側)
// include/linux/cgroup.h
// カーネル内のコントローラの実装:
;
// memcg: css = mem_cgroup (cgroup ごとに1つ)
// blkio: css は request_queue にマウントされる
参考
- ソースコード:
kernel/cgroup/cgroup.c(コアフレームワーク),mm/memcontrol.c(memory),block/blk-cgroup.c(io),kernel/sched/core.c(cpu) - カーネルドキュメント:
Documentation/admin-guide/cgroup-v2.rst(非常に良い) - LWN: "cgroup v2", "Memory control group design"
キーワード: cgroup v2, controllers, cpu.weight, memory.max, io.max, PSI, memcg reclaim, cgroupfs