Cgroups是什么?
cgroups(Control Groups) 是 linux 內核提供的一種機制,這種機制可以根據需求把一系列系統任務及其子任務整合(或分隔)到按資源劃分等級的不同組內,從而為系統資源管理提供一個統一的框架。簡單說,cgroups 可以限制、記錄任務組所使用的物理資源。本質上來說,cgroups 是內核附加在程序上的一系列鉤子(hook),通過程序運行時對資源的調度觸發相應的鉤子以達到資源追蹤和限制的目的。
本文以 Ubuntu 16.04 系統為例介紹 cgroups,所有的 demo 均在該系統中演示。
為什么要了解 cgroups
在以容器技術為代表的虛擬化技術大行其道的時代了解 cgroups 技術是非常必要的!比如我們可以很方便的限制某個容器可以使用的 CPU、內存等資源,這究竟是如何實現的呢?通過了解 cgroups 技術,我們可以窺探到 linux 系統中整個資源限制系統的脈絡。從而幫助我們更好的理解和使用 linux 系統。
cgroups 的主要作用
實現 cgroups 的主要目的是為不同用戶層面的資源管理提供一個統一化的接口。從單個任務的資源控制到操作系統層面的虛擬化,cgroups 提供了四大功能:
資源限制:cgroups 可以對任務是要的資源總額進行限制。 比如設定任務運行時使用的內存上限,一旦超出就發 OOM。 優先級分配:通過分配的 CPU 時間片數量和磁盤 IO 帶寬,實際上就等同于控制了任務運行的優先級。 資源統計:cgoups 可以統計系統的資源使用量,比如 CPU 使用時長、內存用量等。這個功能非常適合當前云端產品按使用量計費的方式。 任務控制:cgroups 可以對任務執行掛起、恢復等操作。相關概念
Task(任務) 在 linux 系統中,內核本身的調度和管理并不對進程和線程進行區分,只是根據 clone 時傳入的參數的不同來從概念上區分進程和線程。這里使用 task 來表示系統的一個進程或線程。
Cgroup(控制組) cgroups 中的資源控制以 cgroup 為單位實現。Cgroup 表示按某種資源控制標準劃分而成的任務組,包含一個或多個子系統。一個任務可以加入某個 cgroup,也可以從某個 cgroup 遷移到另一個 cgroup。
Subsystem(子系統) cgroups 中的子系統就是一個資源調度控制器(又叫 controllers)。比如 CPU 子系統可以控制 CPU 的時間分配,內存子系統可以限制內存的使用量。以筆者使用的 Ubuntu 16.04.3 為例,其內核版本為 4.10.0,支持的 subsystem 如下( cat /proc/cgroups):
blkio 對塊設備的 IO 進行限制。
cpu 限制 CPU 時間片的分配,與 cpuacct 掛載在同一目錄。
cpuacct 生成 cgroup 中的任務占用 CPU 資源的報告,與 cpu 掛載在同一目錄。
cpuset 給 cgroup 中的任務分配獨立的 CPU(多處理器系統) 和內存節點。
devices 允許或禁止 cgroup 中的任務訪問設備。
freezer 暫停/恢復 cgroup 中的任務。
hugetlb 限制使用的內存頁數量。 
memory 對 cgroup 中的任務的可用內存進行限制,并自動生成資源占用報告。
net_cls 使用等級識別符(classid)標記網絡數據包,這讓 Linux 流量控制器(tc 指令)可以識別來自特定 cgroup 任務的數據包,并進行網絡限制。
net_prio 允許基于 cgroup 設置網絡流量(netowork traffic)的優先級。
perf_event 允許使用 perf 工具來監控 cgroup。
pids 限制任務的數量。
Hierarchy(層級) 層級有一系列 cgroup 以一個樹狀結構排列而成,每個層級通過綁定對應的子系統進行資源控制。層級中的 cgroup 節點可以包含零個或多個子節點,子節點繼承父節點掛載的子系統。一個操作系統中可以有多個層級。
cgroups 的文件系統接口
新聞熱點
疑難解答