簡介 Linux CGroup全稱Linux Control Group, 是Linux內核的一個功能,用來限制,控制與分離一個進程組群的資源(如CPU、記憶體、磁碟輸入輸出等)。這個項目最早是由Google的工程師在2006年發起(主要是Paul Menage和Rohit Seth),最早的名稱為進 ...
一、Linux control groups
簡介
Linux CGroup全稱Linux Control Group, 是Linux內核的一個功能,用來限制,控制與分離一個進程組群的資源(如CPU、記憶體、磁碟輸入輸出等)。這個項目最早是由Google的工程師在2006年發起(主要是Paul Menage和Rohit Seth),最早的名稱為進程容器(process containers)。在2007年時,因為在Linux內核中,容器(container)這個名詞太過廣泛,為避免混亂,被重命名為cgroup,並且被合併到2.6.24版的內核中。 主要提供瞭如下功能:- Resource limitation: 限制資源使用,比如記憶體使用上限以及文件系統的緩存限制。
- Prioritization: 優先順序控制,比如:CPU利用和磁碟IO吞吐。
- Accounting: 一些審計或一些統計,主要目的是為了計費。
- Control: 掛起進程,恢復執行進程。
CGroup的術語
任務(Tasks):就是系統的一個進程。 控制組(Control Group):一組按照某種標準劃分的進程,其表示了某進程組,Cgroups中的資源控制都是以控制組為單位實現,一個進程可以加入到某個控制組。而資源的限制是定義在這個組上,簡單點說,cgroup的呈現就是一個目錄帶一系列的可配置文件。 層級(Hierarchy):控制組可以組織成hierarchical的形式,既一顆控制組的樹(目錄結構)。控制組樹上的子節點繼承父結點的屬性。簡單點說,hierarchy就是在一個或多個子系統上的cgroups目錄樹。 子系統(Subsystem):一個子系統就是一個資源控制器,比如CPU子系統就是控制CPU時間分配的一個控制器。子系統必須附加到一個層級上才能起作用,一個子系統附加到某個層級以後,這個層級上的所有控制族群都受到這個子系統的控制。Cgroup的子系統可以有很多,也在不斷增加中。以下為內核3.10+支持的子系統(可以通過 ls /sys/fs/cgroup 查看到):- blkio — 這個子系統為塊設備設定輸入/輸出限制,比如物理設備(磁碟,固態硬碟,USB 等等)。
- cpu — 這個子系統使用調度程式提供對 CPU 的 cgroup 任務訪問。
- cpuacct — 這個子系統自動生成 cgroup 中任務所使用的 CPU 報告。
- cpuset — 這個子系統為 cgroup 中的任務分配獨立 CPU(在多核系統)和記憶體節點。
- devices — 這個子系統可允許或者拒絕 cgroup 中的任務訪問設備。
- freezer — 這個子系統掛起或者恢復 cgroup 中的任務。
- memory — 這個子系統設定 cgroup 中任務使用的記憶體限制,並自動生成記憶體資源使用報告。
- net_cls — 這個子系統使用等級識別符(classid)標記網路數據包,可允許 Linux 流量控製程序(tc)識別從具體 cgroup 中生成的數據包。
- net_prio — 這個子系統用來設計網路流量的優先順序
- hugetlb — 這個子系統主要針對於HugeTLB系統進行限制,這是一個大頁文件系統。
操作介面
在linux系統中一皆文件,當然對CGroup的介面操作也是通過文件來實現的,我們可以通過mount命令查看其掛載目錄:
以上目錄都可以是限制的對象,也就是對應的術語中的各個子系統。例如查看這裡的CPU限制目錄:
如果你熟悉CPU管理的話,cfs_period 和 cfs_quota兩個可能不會陌生,這兩個參數需要組合使用,可以用來限制進程在長度為cfs_period 的一段時間內,只能被分配到總量為cfs_quota 的 CPU 時間。以下示例將會演示如何限制。
限制CPU
限制CPU的使用需要在子系統目錄(/sys/fs/cgroup/cpu)下創建目錄,這裡創建一個cpu_limit_demo目錄:
可以看到當我們在CPU子系統下創建目錄時候,其對應的限制配置文件會自動進行創建,現在在後臺寫個死迴圈跑滿CPU:
此時使用top命令查看pid為10069的進程CPU使用狀況:
如圖可見,此時該進程使用的CPU1已經是100%,即%Cpu :100.0 us,我們先來查看我們剛纔創建的cpu_limit_demo目錄下這兩個參數預設值是多少:cpu.cfs_quota_us值為-1代表沒有任何限制,cpu.cfs_period_us 則是預設的 100 ms,即100000us,下麵將向cpu_limit_demo控制組的cpu.cfs_quota_us文件寫入50ms即50000us,這表示在100ms周期內,cpu最多使用%50,同時將該進程的pid號為10069寫入對應的tasks文件,表示對那個進程限制:
於是pid為10069的進程cpu就被限製成了%Cpu :50.0 us,此時利用top在此查看cpu使用情況(top後按1可看到每個邏輯cpu具體使用):
以上可以看到此時pid10069的進程使用率已經變成了50%了,說明限制生效了。同樣的道理,在/sys/fs/cgroup下的子系統都可以限制不通的資源使用如Block IO、Memory等。
限制記憶體
首先在 /sys/fs/cgroup/memory 下新建一個名為 limit_memory_demo 的 cgroup:
mkdir /sys/fs/cgroup/memory/limit_memory_demo
限制該 cgroup 的記憶體使用量為 500 MB:
# 物理記憶體500M(下麵單位Byte) MB並且不使用swap echo 524288000 > /sys/fs/cgroup/memory/limit_memory/memory.limit_in_bytes echo 0 > /sys/fs/cgroup/memory/limit_memory/memory.swappiness
最後將需要限制的進程號的pid寫入task文件就可以了:
echo [pid] > /sys/fs/cgroup/memory/limit_memory_demo/tasks
限制磁碟IO
使用dd寫到null設備:
[root@app51 blkio]# dd if=/dev/sda of=/dev/null bs=1M
使用iotop(安裝使用yum install -y iotop)查看io速率,此時讀的速率為2.17G/s