虛擬化與容器

控制群組(control groups)

/ SEE-groups /

控制群組(control groups),幾乎總是簡稱 cgroups,是限制並計量「一群行程被允許使用多少機器資源」的核心功能。如果命名空間回答「一個容器能看到什麼」,控制群組就回答「它能用多少」。把它想成在共用廚房裡給每個團隊一份有計量的額度:這個團隊每小時最多只能用兩個爐口與固定量的瓦斯,無論他們多餓——這樣一個貪心的團隊就絕不會害其他人面對冷灶。

具體來說,你把一組行程放進一個控制群組,再透過資源控制器(controller)為該群組掛上限制。CPU 控制器限制該群組能取得多少處理器時間,或相對於其他群組賦予它權重。記憶體控制器為該群組能用的 RAM 設下硬性上限,若它試圖超過便可將它終止或節流。還有給區塊裝置輸入輸出頻寬的控制器、給行程數量的控制器,等等。核心既執行這些上限,也測量實際用量,所以 cgroups 也是系統據以精確追蹤「每個容器正消耗多少 CPU 與記憶體」的方式。

控制群組之所以重要,是因為它是容器的「資源限制」那一半:命名空間隔離視角,cgroups 隔離消耗,兩者合起來讓許多容器能安全地共用一台主機,而不會有任何一個獨佔機器。它們也用在容器之外——例如讓一個背景工作不去餓死互動式桌面。誠實的提醒是:cgroups 限制的是資源用量,而非安全:它們能阻止容器耗盡 CPU 或記憶體,但它們本身並不能阻止容器看見或攻擊它不該碰的東西——那是命名空間與核心保護機制的工作。

一台主機跑十個容器,把每個的 cgroup 都限制在 10% 的 CPU 與 512 MB 記憶體。其中一個容器陷入無窮迴圈、試圖把一切吃光——但它的 cgroup 把它節流在它那 10% 的份額,所以另外九個容器與主機都保持反應靈敏。

cgroup 把一個失控的容器卡住上限,使它無法餓死鄰居。

控制群組限制的是資源消耗,而非存取:它們阻止容器耗盡 CPU、記憶體或輸入輸出,但它們不是安全邊界。「行程能看到、碰到什麼」的隔離,來自命名空間與核心的保護,而非來自 cgroups。

又称
cgroupscgroups