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;
运行脚本
./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