cgroup是control group的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。
cgroup服务的启动和停止:
cgroup启动时,会读取配置文件/etc/cgconfig.conf的内容,根据其内容创建和挂载指定的cgroup子系统。
上面定义相当于如下shell指令:
(2)group section的语法格式如下:
举个例子:
至于,cgroup的其他相关知识,将在后续的文章中介绍。
子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源,目前,redhat默认支持10个子系统,但默认只挂载了8个子系统,ubuntu 12.04 默认支持8个子系统,但默认只挂载了5个子系统。
redhat默认支持和挂载的子系统如下图所示。
ubuntu 12.04默认支持和挂载的子系统如下图所示。
当然也用户可以自定义子系统并进行挂载。
下面对每一个子系统进行简单的介绍:
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非常有用,具体参见:
2. libcgroup工具安装
redhat系统:
- yum install libcgroup
ubuntu系统:
- sudo apt-get install cgroup-bin
- service cgconfig start|stop
3.cgroup配置文件分析
/etc/cgconfig.conf是cgroup配置工具libcgroup用来进行cgroup组的定义,参数设定以及挂载点定义的配置文件,
主要由mount和group两个section构成。
(1)mount section的语法格式如下:
- mount {
-
= ; - ...
- }
- #########################################
- # controller:内核子系统的名称
- # path:该子系统的挂载点
- #########################################
举个例子:
- mount {
- cpuset = /cgroup/red;
- }
- mkdir /cgroup/red
- mount -t cgroup -o cpuset red /cgroup/red
- group
{ - [
] -
{ - = ;
- …
- }
- …
- }
################################################################################
## name: 指定cgroup的名称
## permissions:可选项,指定cgroup对应的挂载点文件系统的权限,root用户拥有所有权限。
## controller:子系统的名称
## param name 和 param value:子系统的属性及其属性值
#################################################################################
- mount { ## 定义需要创建的cgroup子系统及其挂载点,这里创建cpu与cpuacct(统计)两个cgroup子系统
- cpu = /mnt/cgroups/cpu;
- cpuacct = /mnt/cgroups/cpu;
- }
- group daemons/www { ## 定义daemons/www(web服务器进程)组
- perm { ## 定义这个组的权限
- task {
- uid = root;
- gid = webmaster;
- }
- admin {
- uid = root;
- gid = root;
- }
- }
- cpu { ## 定义cpu子系统的属性及其值,即属于词组的任务的权重为1000
- cpu.shares = 1000;
- }
- }
- group daemons/ftp { ## 定义daemons/ftp(ftp进程)组
- perm {
- task {
- uid = root;
- gid = ftpmaster;
- }
- admin {
- uid = root;
- gid = root;
- }
- }
- cpu { ## 定义词组的任务的权重为500
- cpu.shares = 500;
- }
- }
上面配置文件定义相当于执行了如下shell命令:
- mkdir /mnt/cgroups/cpu
- mount -t cgroup -o cpu,cpuacct cpu /mnt/cgroups/cpu
- mkdir /mnt/cgroups/cpu/daemons
- mkdir /mnt/cgroups/cpu/daemons/www
- chown root:root /mnt/cgroups/cpu/daemons/www/*
- chown root:webmaster /mnt/cgroups/cpu/daemons/www/tasks
- echo 1000 > /mnt/cgroups/cpu/daemons/www/cpu.shares
- mkdir /mnt/cgroups/cpu/daemons/ftp
- chown root:root /mnt/cgroups/cpu/daemons/ftp/*
- chown root:ftpmaster /mnt/cgroups/cpu/daemons/ftp/tasks
- echo 500 > /mnt/cgroups/cpu/daemons/ftp/cpu.shares