cgroup是control group的簡稱,它爲Linux內核提供了一種任務彙集和劃分的機制,經過一組參數集合將一些任務組織成一個或多個子系統。 linux
Cgroups是control groups的縮寫,最初由Google工程師提出,後來編進linux內核。docker
Cgroups是實現IaaS虛擬化(kvm、lxc等),PaaS容器沙箱(Docker等)的資源管理控制部分的底層基礎。shell
子系統是根據cgroup對任務的劃分功能將任務按照一種指定的屬性劃分紅的一個組,主要用來實現資源的控制。在cgroup中,劃分紅的任務組以層次結構的形式組織,多個子系統造成一個數據結構中相似多根樹的結構。cgroup包含了多個孤立的子系統,每個子系統表明單一的資源,目前,redhat默認支持10個子系統,但默認只掛載了8個子系統,ubuntu 12.04 默認支持8個子系統,但默認只掛載了5個子系統。ubuntu
下面對每個子系統進行簡單的介紹:網絡
blkio 設置限制每一個塊設備的輸入輸出控制。例如:磁盤,光盤以及usb等等。數據結構
cpu 使用調度程序爲cgroup任務提供cpu的訪問。tcp
cpuacct 產生cgroup任務的cpu資源報告。工具
cpuset 若是是多核心的cpu,這個子系統會爲cgroup任務分配單獨的cpu和內存。spa
devices 容許或拒絕cgroup任務對設備的訪問。.net
freezer 暫停和恢復cgroup任務。
memory 設置每一個cgroup的內存限制以及產生內存資源報告。
net_cls 標記每一個網絡包以供cgroup方便使用。
ns 名稱空間子系統。
perf_event 增長了對每group的監測跟蹤的能力,便可以監測屬於某個特定的group的全部線程以及運行在特定CPU上的線程,此功能對於監測整個group很是有用,具體參見 http://lwn.net/Articles/421574/
yum install libcgroup
由於本機器以前已經安裝了 docker,因此默認已經安裝了 libcgroup
Cgroup 對應的文件系統在 /sys/fs/cgroup
新建一個耗CPU的腳本
#!/bin/sh x=0 while [ True ];do x=$x+1 done;
運行腳本
./testcup.sh
使用 top 命令監控,發現 testcup.sh 佔用了 100% 的CPU
下面用cgroups控制這個進程的cpu資源
mkdir /sys/fs/cgroup/cpu/foo
echo 50000 > /sys/fs/cgroup/cpu/foo/cpu.cfs_quota_us #將cpu.cfs_quota_us設爲50000,相對於cpu.cfs_period_us的100000是50%
echo 12559 > /sys/fs/cgroup/cpu/foo/tasks # 12559 爲上面截圖中 testcup.sh 對應的 PID
再觀察 top,發現 testcpu.sh CPU的佔用降低到了 50% 左右
新建一個耗內存的腳本,內存不斷增加
#!/bin/sh x="a" while [ True ];do x=$x$x done;
top 監控發現內存不斷增大
下面用cgroups控制這個進程的內存資源
mkdir -p /sys/fs/cgroup/memory/foo
echo 1048576 > /sys/fs/cgroup/memory/foo/memory.limit_in_bytes #分配1MB的內存給這個控制組
echo 2663 > /sys/fs/cgroup/memory/foo/tasks # 重啓過任務,因此這裏PID有變化了
加入控制以後再觀察 top,該進程的內存佔用不在增長,而是一直保持,進程進入休眠狀態
參考:
http://my.oschina.net/cloudcoder/blog/424418
http://www.infoq.com/cn/articles/docker-kernel-knowledge-cgroups-resource-isolation