cgroup(control group)是 Linux 核心替一組行程記帳與設限的機制:把行程放進一個群組,核心就會統計這個群組用了多少 CPU、記憶體與磁碟讀寫,並依群組的設定限制或分配它們。容器的資源限制都建立在它上面:Docker 的 --cpus、--memory 與 Kubernetes 的 requests、limits,最後都寫成某個 cgroup 的控制檔;cAdvisor 讀 cgroup 的統計,輸出每個容器的用量,見 Prometheus Exporter。

概念位置

現在的發行版多半用 cgroup v2(單一階層,控制檔都在 /sys/fs/cgroup/<群組>/ 下);舊的 v1 每種資源各有一個階層、檔名不同。v2 的常用控制檔與它們的上層參數:

控制檔作用Docker/Kubernetes 的參數
cpu.maxCPU 上限:每個週期最多用多少時間,用完就暫停到下個週期(CPU throttling)--cpus;limits.cpu
cpu.weight搶 CPU 時的相對權重,不搶時不生效--cpu-shares;requests.cpu 換算而來
memory.max記憶體上限,超過時核心在群組內結束行程(OOM)--memory;limits.memory
memory.low、memory.min記憶體保留:主機吃緊時盡量(low)或一定(min)不回收這個群組的記憶體--memory-reservation 對應 low
io.max、io.weight磁碟讀寫的上限與權重,效果依磁碟與排程器而定--device-read-bps 等

各層級的隔離能做到什麼、做不到什麼,見 共用主機的資源競爭〈隔離的層級與代價〉;單一容器的值怎麼定,見 Resource Limit。

可觀察訊號與例子

設計責任

設定容器的限制前,先確認主機用的是 cgroup v1 還是 v2(stat -fc %T /sys/fs/cgroup 回 cgroup2fs 是 v2),文件裡的控制檔名稱與指標依版本不同。限制寫進部署設定,不在主機上手動改控制檔。