Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2619347
  • 博文数量: 258
  • 博客积分: 9440
  • 博客等级: 少将
  • 技术积分: 6998
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-03 10:28
个人简介

-- linux爱好者,业余时间热衷于分析linux内核源码 -- 目前主要研究云计算和虚拟化相关的技术,主要包括libvirt/qemu,openstack,opennebula架构和源码分析。 -- 第五届云计算大会演讲嘉宾 微博:@Marshal-Liu

文章分类

全部博文(258)

文章存档

2016年(1)

2015年(4)

2014年(16)

2013年(22)

2012年(41)

2011年(59)

2010年(40)

2009年(75)

分类: LINUX

2012-07-31 10:27:30

1. cgroup介绍
  cgroup是control group的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。
  子系统是根据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非常有用,具体参见:    
                 http://lwn.net/Articles/421574/

2. libcgroup工具安装
redhat系统:
  1. yum install libcgroup
ubuntu系统: 
  1. sudo apt-get install cgroup-bin
cgroup服务的启动和停止:
  1. service cgconfig start|stop
cgroup启动时,会读取配置文件/etc/cgconfig.conf的内容,根据其内容创建和挂载指定的cgroup子系统。

3.cgroup配置文件分析
/etc/cgconfig.conf是cgroup配置工具libcgroup用来进行cgroup组的定义,参数设定以及挂载点定义的配置文件,
主要由mount和group两个section构成。
(1)mount section的语法格式如下:

  1. mount {
  2. = ;
  3. ...
  4. }
  5. #########################################
  6. # controller:内核子系统的名称
  7. # path:该子系统的挂载点
  8. #########################################
举个例子:

  1. mount {
  2. cpuset = /cgroup/red;
  3. }
上面定义相当于如下shell指令:

  1. mkdir /cgroup/red
  2. mount -t cgroup -o cpuset red /cgroup/red


(2)group section的语法格式如下:

  1. group {
  2. []
  3. {
  4. = ;
  5. }
  6. }
################################################################################
## name: 指定cgroup的名称
## permissions:可选项,指定cgroup对应的挂载点文件系统的权限,root用户拥有所有权限。
## controller:子系统的名称
## param name 和 param value:子系统的属性及其属性值
#################################################################################
举个例子:

  1. mount { ## 定义需要创建的cgroup子系统及其挂载点,这里创建cpu与cpuacct(统计)两个cgroup子系统
  2. cpu = /mnt/cgroups/cpu;
  3. cpuacct = /mnt/cgroups/cpu;
  4. }

  5. group daemons/www { ## 定义daemons/www(web服务器进程)组
  6. perm { ## 定义这个组的权限
  7. task {
  8. uid = root;
  9. gid = webmaster;
  10. }
  11. admin {
  12. uid = root;
  13. gid = root;
  14. }
  15. }

  16. cpu { ## 定义cpu子系统的属性及其值,即属于词组的任务的权重为1000
  17. cpu.shares = 1000;
  18. }
  19. }

  20. group daemons/ftp { ## 定义daemons/ftp(ftp进程)组
  21. perm {
  22. task {
  23. uid = root;
  24. gid = ftpmaster;
  25. }
  26. admin {
  27. uid = root;
  28. gid = root;
  29. }
  30. }
  31. cpu { ## 定义词组的任务的权重为500
  32. cpu.shares = 500;
  33. }
  34. }
上面配置文件定义相当于执行了如下shell命令:

  1. mkdir /mnt/cgroups/cpu
  2. mount -t cgroup -o cpu,cpuacct cpu /mnt/cgroups/cpu
  3. mkdir /mnt/cgroups/cpu/daemons
  4. mkdir /mnt/cgroups/cpu/daemons/www
  5. chown root:root /mnt/cgroups/cpu/daemons/www/*
  6. chown root:webmaster /mnt/cgroups/cpu/daemons/www/tasks
  7. echo 1000 > /mnt/cgroups/cpu/daemons/www/cpu.shares
  8. mkdir /mnt/cgroups/cpu/daemons/ftp
  9. chown root:root /mnt/cgroups/cpu/daemons/ftp/*
  10. chown root:ftpmaster /mnt/cgroups/cpu/daemons/ftp/tasks
  11. echo 500 > /mnt/cgroups/cpu/daemons/ftp/cpu.shares
至于,cgroup的其他相关知识,将在后续的文章中介绍。
阅读(24116) | 评论(0) | 转发(5) |
给主人留下些什么吧!~~