參考:
http://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html
http://baike.baidu.com/link?url=o3EDZZKaX9NJx8G1KvBgAj_Cnh9Z9yZXvcSaiIAVrkZ6je5VmVrab9QbEUq50XBSTOpYpc0opyeuUEw0dE5U9q
《kvm虛擬化技術 實戰與原理解析》
簡介:
kvm中我們可以用-m -smp等參數爲客戶機分配資源,但是這種分配是粗粒度的資源分配,假設這麼一種場景:本地磁盤上有兩臺客戶機提供mysql服務,但是其中一臺對數據的安全比較高,需要及時把數據寫入到磁盤裏,另外一臺對數據安全要求不高,慢一點也無所謂,兩者的i/o請求相當。 此時,如果我們仍然像之前的方法簡單地把設備分配給客戶機,那麼兩臺客戶機的i/o速度相當,達不到我們的目的。這個時候cgroup派上用處了。
cgroup的概念:
任務:就是系統中運行的進程,一個進程是一個或者多個控制組的成員
控制羣組(control group):一個控制羣組就是按照某種標準劃分的一組任務,每個在控制羣組裏面的任務受到這個控制羣組的資源限制
層級體系(hierarchy):簡稱層級,控制羣組可以組織成 hierarchical 的形式,既一顆控制族羣樹。控制族羣樹上的子節點控制族羣是父節點控制族羣的孩子,繼承父控制族羣的特定的屬性子系統(subsystem)。一個子系統就是一個資源控制器,比如 cpu 子系統就是控制 cpu 時間分配的一個控制器。子系統必須附加(attach)到一個層級上才能起作用,一個子系統附加到某個層級以後,這個層級上的所有控制族羣都受到這個子系統的控制。
下圖來自於書本《kvm虛擬化技術 實戰與原理解析》:
簡而言之,cgroup就類似於一個服務公司的運行,一個公司(系統資源)劃分成不同的部門(層級),每個部門提供不同的服務(子系統),每個客戶(任務)能享受不同等級的服務(cgroup),所以這樣一來它們的關係就好理解了:
(下面內容摘抄自http://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html)
(1)每次在系統中創建新層級時,該系統中的所有任務都是那個層級的默認 cgroup(我們稱之爲 root cgroup,此 cgroup 在創建層級時自動創建,後面在該層級中創建的 cgroup 都是此 cgroup 的後代)的初始成員; //每個客戶都能享受基本的服務等級
(2)一個子系統最多隻能附加到一個層級; //一種服務只會在某個部門提供,比如技術方面的服務你只能找技術部
(3)一個層級可以附加多個子系統; //一個部門可以提供多個服務,比如技術部的程序員還提供日常被虐狗表演~~
(4)一個任務可以是多個 cgroup 的成員,但是這些 cgroup 必須在不同的層級; //你可以既要美女前臺接待又要程序員寫代碼,但是你不能同時要兩個美女前臺接待你,否則程序員不會放過你~~
(5)系統中的進程(任務)創建子進程(任務)時,該子任務自動成爲其父進程所在 cgroup 的成員。然後可根據需要將該子任務移動到不同的 cgroup 中,但開始時它總是繼承其父任務的 cgroup。 //客戶的會員卡可以給他兒子用,當然,他兒子可以找更漂亮的前臺服務~~
可用的子系統(摘抄自:http://baike.baidu.com/link?url=o3EDZZKaX9NJx8G1KvBgAj_Cnh9Z9yZXvcSaiIAVrkZ6je5VmVrab9QbEUq50XBSTOpYpc0opyeuUEw0dE5U9q)
blkio -- 這個子系統爲塊設備設定輸入/輸出限制,比如物理設備(磁盤,固態硬盤,USB 等等)。
cpu -- 這個子系統使用調度程序提供對 CPU 的 cgroup 任務訪問。
cpuacct -- 這個子系統自動生成 cgroup 中任務所使用的 CPU 報告。
cpuset -- 這個子系統爲 cgroup 中的任務分配獨立 CPU(在多核系統)和內存節點。
devices -- 這個子系統可允許或者拒絕 cgroup 中的任務訪問設備。
freezer -- 這個子系統掛起或者恢復 cgroup 中的任務。
memory -- 這個子系統設定 cgroup 中任務使用的內存限制,並自動生成由那些任務使用的內存資源報告。
net_cls -- 這個子系統使用等級識別符(classid)標記網絡數據包,可允許 Linux 流量控制程序(tc)識別從具體 cgroup 中生成的數據包。
ns -- 名稱空間子系統。
perf_event -- 這個子系統主要用於對系統中運行的性能監控、採樣和分析等
可以在linux 中使用 lssubsys -am 查看系統支持的子系統
cgroup的操作:
1.查看內核支持:
cat /boot/config-2.6.32-431.el6.x86_64 |grep -i cgroup
2.創建cgroup並附加任務
mkdir -p /cgroup/blkio
mount -t cgroup -o blkio blkio /cgroup/blkio #-o blkio 代表blkio這個子系統,第二個blkio代表層級名,這個層級掛載到/cgroup/blkio上
(mount -t cgroup -o cpu,cpuset,memory cpu_mem /cgroup/cpu_mem) #類似這條就是把cpu,cpuset,memory這三個子系統附加到cpu_mem這個層級上,掛載目錄爲/cgroup/cpu_mem
mkdir /cgroup/blkio/high_prio #創建高等級的控制羣組
mkdir /cgroup/blkio/low_prio #創建低等級的羣組
echo 1000>/cgroup/blkio/high_prio/blkio.weight #設置控制羣組的權重,取值爲100-1000,越大優先級越高
echo 100>/cgroup/blkio/low_prio/blkio.weight
ps aux #找到你想要控制的進程的id號
echo "$pid">/cgroup/blkio/high_prio/tasks #把進程加入到控制羣組,也可以查看/cgroup/blkio/tasks,默認所有的進程都會添加到這個根cgroup
也可以使用libcgroup提供的cgcreate等工具來管理cgroup ,這個rpm包提供了一個服務:/etc/init.d/cgconfig 它的配置文件爲/etc/cgconfig.conf,可以修改這個配置文件來管理cgroup,但是本質和本文的操作一樣。