What is Cgroup?
Cgroups 是 control groups 的縮寫,是 Linux 核心提供的一種可以限制、記錄、隔離行程組(process groups)所使用的物理資源(如:cpu,memory,IO 等等)的機制。最初由 google 的工程師提出,後來被整合進 Linux 核心。Cgroups 也是 LXC 為實現虛擬化所使用的資源管理手段,可以說沒有 cgroups 就沒有 LXC。
摘自Linux Cgroups詳解(王喆鋒)
What Cgroup can do?
1.限制行程組可以使用的資源數量,限制行程最大使用的記憶體等
2.行程組的優先順序控制,比如為某個行程組分配特定的cpu share
3.記錄行程組使用的資源數量,比如記錄某個行程CPU的使用時間
4.行程組隔離,比如透過namespace以達到隔離的目的
5.行程組控制,比如可以將行程組掛起或恢復
整理自linux Cgroup詳解(王喆鋒)
Cgroup Model
行程模型
在說Cgroup的模型之前,先回顧下行程模型,在linux系統上,所有的行程都有一個共同的父行程,叫做init行程,這個行程在核心啟動的時候開始執行,然後透過init行程啟動其他的行程,這些行程都是init的子行程。因為所有的行程都有一個共同的父行程。那麼linux的行程模型就是一個單繼承層次的模型,或者稱之為樹狀模型。除此之外每一個linux行程但是除了init行程,都繼承了一些環境變數(例如PATH環境變數)
Cgroup Model
Cgroup其實和行程類似:
Cgroup也是繼承體系,並且子cgroup繼承其父cgroup的某些屬性,兩者最基本的差別在於,行程是單繼承體系。而Cgroup可以存在多個不同的繼承體系.(意思就是可以有多個單繼承體系,每個單繼承體系互不影響)
Some concepts of Cgroup
在Cgroup中有這樣四個概念,可以說理解了這四個概念,那麼對於如何使用cgroup,將會是如魚得水。
-
Subsystems: 稱之為子系統,一個子系統就是一個資源控制器,比如 cpu子系統就是控制cpu時間分配的一個控制器。
-
Hierarchies: 可以稱之為層次體系也可以稱之為繼承體系,指的是Control Groups是按照層次體系的關係進行組織的。
-
Control Groups: 一組按照某種標準劃分的行程。行程可以從一個Control Groups遷移到另外一個Control Groups中,同時Control Groups中的行程也會受到這個組的資源限制。
-
Tasks: 在cgroups中,Tasks就是系統的一個行程。
Subsystems
在Red_Hat_Enterprise_Linux-6系列的linux中,預設提供瞭如下子系統。
-
blkio這個子系統為塊裝置設定輸入/輸出限制,比如物理裝置(磁碟,固態硬碟,USB 等等) 。
-
cpu這個子系統使用排程程式提供對 CPU 的 cgroup 任務訪問。
-
cpuacct這個子系統自動生成 cgroup 中任務所使用的 CPU 報告。
-
cpuset這個子系統為 cgroup 中的任務分配獨立 CPU(在多核系統)和記憶體節點。
-
devices這個子系統可允許或者拒絕 cgroup 中的任務訪問裝置。
-
freezer這個子系統掛起或者恢復 cgroup 中的任務。
-
memory這個子系統設定 cgroup 中任務使用的記憶體限制,並自動生成由那些任務使用的記憶體資源報告。
-
net_cls這個子系統使用等級識別符(classid)標記網路資料包,可允許 Linux 流量控製程式(tc)識別從具體 cgroup 中生成的資料包。
-
ns名稱空間子系統。
Relationships Between Subsystems, Hierarchies, Control Groups and Tasks
這個部分恐怕是這篇文章的重點了吧,這個部分我主要參考紅帽的關於資源管理的手冊在這個部分透過引入4條規則,來幫助我們更好的去理解這個四者的關係。
-
規則1,一個單繼承體系(單層次體系)可以附加1個或者多個子系統
在上面的這個圖中,Cpu和Memory兩個子系統附加到了cpu_mem_cg的這個繼承體系中cg1和cg2是兩個Control Groups,但是需要註意的是,如果此前有Cpu或者Memory子系統附加到q其它繼承體系中的,那麼Cpu或者Memory就不能再次附加到cpu_mem_cg這個繼承體系中了。
-
規則2,一個子系統,不能被附加到多個繼承體系中。
其實這條規則我已經在規則1中簡單的進行了闡述,上面的這副圖中,可以看出CPU子系統已經被附加到左側的cpu_cg這個繼承體系中了,當cpu子系統要再次被附加到cpu_mem_cg的時候,會發生附加失敗。
-
規則3,每當在系統中建立一個繼承體系的時候,會預設再建立一個control groups,並且這個control groups被稱之為root cgroup,此時整個系統中的tasks(行程)都屬於這個root cgroup。系統中的行程,在一個繼承體系中都明確的屬於一個control groups,並且這個行程可以從一個control groups移動到另外一個control groups中,但是需要主要的是,在一個繼承體系中一個行程是沒辦法同時屬於兩個control groups的,但是一個行程可以同時屬於兩個不同的繼承體系中的control groups。
在上面的這副圖中可以看出httpd這個行程無法同時屬於A繼承體系中的cg1和cg2這兩個control groups,但是httpd行程卻可以同時屬於A繼承體系中的cg1和B繼承體系中的cg3。
-
規則4,系統上的任何task(行程)透過fork建立子task(行程)的時候,這個子task(行程),自動繼承其父task(行程)的control groups,成為這個control groups的一員。此後這個子task(行程)可以移動到其他control groups中,父task(行程)和子task(行程)完全獨立。
在上面的這副圖中,可以看出httpd行程fork出來的子行程仍然是屬於cg1這個control group的。
Reference
本文主要參考紅帽關於資源管理的紅皮書。和王喆鋒的Linux Cgroups詳解
Red_Hat_Enterprise_Linux-6-Resource_Management_Guide-en-US
Linux Cgroups詳解