kvm cgroup的使用

參考:

    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虛擬化技術 實戰與原理解析》:

wKiom1hZ-E6jDEZsAALSqvDcOeg334.png

    簡而言之,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,但是本質和本文的操作一樣。 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章