Cgroup的做用和基本用法

cgroup介紹

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

cgroup子系統介紹

下面對每個子系統進行簡單的介紹:網絡

  • 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/

libcgroup工具安裝

yum install libcgroup

由於本機器以前已經安裝了 docker,因此默認已經安裝了 libcgroup

Cgroup 對應的文件系統在 /sys/fs/cgroup

cgroups資源控制

cgroups管理進程cpu資源

新建一個耗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% 左右


cgroups管理進程內存資源

新建一個耗內存的腳本,內存不斷增加

#!/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

相關文章
相關標籤/搜索