1. cgroup介绍
cgroup是control group的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。
子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源,目前,redhat默认支持10个子系统,但默认只挂载了8个子系统,ubuntu 12.04 默认支持8个子系统,但默认只挂载了5个子系统。
- >> lssubsys --all
cpuset //如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存
ns //名称空间子系统
devices //允许或拒绝cgroup任务对设备的访问
freezer //暂停和恢复cgroup任务
net_cls //产生cgroup任务的cpu资源报告
perf_event //增加了对每group的监测跟踪的能力,即可以监测属于某个特定的group的所有线程以及 运行在特定CPU上的线程,此功能对于监测整个group非常有用
net_prio //标记每个网络包以供cgroup方便使用
cpu //这个子系统使用调度程序为cgroup任务提供cpu的访问
cpuacct //产生cgroup任务的cpu资源报告
memory //设置每个cgroup的内存限制以及产生内存资源报告
blkio //这个子系统设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等
2. libcgroup工具安装
redhat系统:
- yum install libcgroup
ubuntu系统:
- sudo apt-get install cgroup-bin
cgroup服务的启动和停止:
- service cgconfig start|stop
cgroup启动时,会读取配置文件/etc/cgconfig.conf的内容,根据其内容创建和挂载指定的cgroup子系统。
3.cgroup配置文件分析
/etc/cgconfig.conf是cgroup配置工具libcgroup用来进行cgroup组的定义,参数设定以及挂载点定义的配置文件,
主要由mount和group两个section构成。
(1)mount section的语法格式如下:
- mount {
- = ;
- ...
- }
- #########################################
- # controller:内核子系统的名称
- # path:该子系统的挂载点
- #########################################
举个例子:
- mount {
- cpuset = /cgroup/red;
- }
上面定义相当于如下shell指令:
- mkdir /cgroup/red
- mount -t cgroup -o cpuset red /cgroup/red
(2)group section的语法格式如下:
- 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
举例:
- >> more cgconfig.conf
# Configuration file generated by cgsnapshot
mount {
cpu = xxx/cgroup/cpu;
cpuacct = xxx/cgroup/cpuacct;
memory = xxx/cgroup/memory;
blkio = xx/cgroup/blkio;
}
group xxx {
perm {
admin {
uid = xxx;
gid = xxx;
}
task {
uid = xxx;
gid = xxx;
}
}
cpu {
cpu.rt_period_us="1000000";
cpu.rt_runtime_us="0";
cpu.cfs_period_us="100000";
cpu.cfs_quota_us="100000";
cpu.shares="1024";
}
}
原文地址:http://blog.chinaunix.net/uid-20940095-id-3294134.html