Cgroup的作用和基本用法

cgroup介绍

cgroup是control group的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。   

Cgroups是control groups的缩写,最初由Google工程师提出,后来编进linux内核。

Cgroups是实现IaaS虚拟化(kvm、lxc等),PaaS容器沙箱(Docker等)的资源管理控制部分的底层基础。

子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源,目前,redhat默认支持10个子系统,但默认只挂载了8个子系统,ubuntu 12.04 默认支持8个子系统,但默认只挂载了5个子系统。

cgroup子系统介绍

下面对每一个子系统进行简单的介绍:

  • blkio 设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。

  • cpu 使用调度程序为cgroup任务提供cpu的访问。

  • cpuacct 产生cgroup任务的cpu资源报告。

  • cpuset 如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。

  • devices 允许或拒绝cgroup任务对设备的访问。

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

Cgroup的作用和基本用法_第1张图片

运行脚本

./testcup.sh

使用 top 命令监控,发现 testcup.sh 占用了 100% 的CPU

Cgroup的作用和基本用法_第2张图片

下面用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% 左右

Cgroup的作用和基本用法_第3张图片


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

你可能感兴趣的:(docker,cgroup)