1. 程式人生 > 程式設計 >CGroups :容器化的基石

CGroups :容器化的基石

1、什麼是CGroups?

CGroups 是 Linux 核心提供的一種限制程式所使用資源的機制,全稱為 Control Groups,使用者可以通過 CGroups 對程式所使用的cpu,記憶體等資源實現精細化的控制與限制,比如說可以限定某個程式的CPU使用數為1,記憶體使用量不超過1G,從而實現了程式級別的資源物理隔離,充分利用物理機的資源。基於這一特性,很多虛擬技術都在底層使用了 CGroups 來進行實現,比如 LXC,Docker ,systemd等等。

2、CGroups 是如何實現物理資源隔離的?

CGroups 通過實現 VFS 介面,提供一種虛擬檔案結構的操作方式來限定程式所能使用的物理資源,遮蔽了具體實現細節,使用者可以比較直觀的通過類檔案操作的方式來實現程式的資源分組隔離。如下是一個典型的CGroups典型應用架構圖:

從上圖可以看到,CGroup 技術可以被用來在作業系統底層限制物理資源,圖中每一個 JVM 程式對應一個 Container Cgroup 層級,通過 CGroup 提供的各類子系統,可以對每一個 JVM 程式對應的執行緒級別進行物理限制。 那麼CGroups的具體模型是什麼樣的呢?在CGroups模型裡面,有幾個非常重要的概念:任務子系統控制組層級樹。下圖顯示了他們之間的邏輯關係:
CGroup 層級結構

2.1 任務(Task)

任務,及系統中的一個程式,為系統中具體執行的載體。

2.2 子系統(SubSystem)

子系統為可以控制的資源,如CPU、Memory、IO等,常見子系統有:

  • cpu 子系統,主要限制程式的 cpu 使用率。
  • cpuacct 子系統,可以統計 cgroups 中的程式的 cpu 使用報告。
  • cpuset 子系統,可以為 cgroups 中的程式分配單獨的 cpu 節點或者記憶體節點。
  • memory 子系統,可以限制程式的 memory 使用量。
  • blkio 子系統,可以限制程式的塊裝置 io。
  • devices 子系統,可以控制程式能夠訪問某些裝置。

2.3 控制組(Control Group)

控制組表示的是一組任務和子系統之間的關係,用以界定系統該如何任務進行資源管控。

2.4 層級樹(hierarchy)

層級樹,一系列 cgroup 組成的樹形結構。每個節點都是一個 cgroup,cgroup 可以有多個子節點,子節點預設會繼承父節點的屬性。

3、使用方法

1、建立層級樹、將需要管控的子系統資源附加到層級樹
2、在層級樹下建立cgroup
3、設定cgroup資源
4、將程式加入到cgroup

4、總結

cgroup 提供了強大的功能,能夠讓我們控制應用的資源使用情況,也能統計資源使用資料,是容器技術的基礎。主要提供如下功能:

  • 資源限制(Resource Limitation):cgroups 可以對程式組使用的資源總額進行限制。如設定應用執行時使用記憶體的上限,一旦超過這個配額就發出 OOM(Out of Memory)。
  • 優先順序分配(Prioritization):通過分配的 CPU 時間片數量及硬碟 IO 頻寬大小,實際上就相當於控制了程式執行的優先順序。
  • 資源統計(Accounting): cgroups 可以統計系統的資源使用量,如 CPU 使用時長、記憶體用量等等,這個功能非常適用於計費。
  • 程式控制(Control):cgroups 可以對程式組執行掛起、恢復等操作。

5、感謝