About
在我的上一篇博文中已经谈到了Cgroup的一些基本概念,以及这些概念之间的关系。那么本篇博文则从感性一面来看看Cgroup到底是个啥?在linux系统上Cgroup被实现为一个filesystem,通过对filesystem的基本操作(mount,read,write等),来
实现对Cgroup的控制。本篇博文的实验环境是Red_Hat_Enterprise_Linux-6.5。
Hierarchy
在开始使用cgroup之前,请先安装下cgroup,yum install libcgroup安装完libcgroup后会在系统上新增了两个服务一个是cgconfig,另一个则是cgred。这两个服务都是辅助用于设置cgroup规则的。
[root@localhost cgroup]# ls /cgroup/
blkio cpu cpuacct cpuset devices freezer memory net_cls
在/cgroup目录已经有一系列创建好了的目录,这里面每一个目录就是一个Hierarchy,只不过还没生效而已。我们只需要将这些目录分别进行挂载就可以生效了。我们自己自己手动挂载后,下次重启这些规则又都会失效,RedHat提供给我们一个cgconfig服务,让我们可以把配置规则放在配置文件中,重启后只要cgconfig开启了就自动生效。这个配置文件就是/etc/cgconfig.conf,下面是配置文件中的内容。
[root@localhost cgroup]# cat /etc/cgconfig.conf
mount {
cpuset = /cgroup/cpuset;
cpu = /cgroup/cpu;
cpuacct = /cgroup/cpuacct;
memory = /cgroup/memory;
devices = /cgroup/devices;
freezer = /cgroup/freezer;
net_cls = /cgroup/net_cls;
blkio = /cgroup/blkio;
}
语法格式如下:
mount {
subsystem = Hierarchy;
}
Redhat已经默认帮我们写好了一些规则了。那么现在只要启动cgcofig服务,这8个Hierarchy就会被挂载生效了。
[root@localhost ~]# /etc/init.d/cgconfig start
Starting cgconfig service: [ OK ]
[root@localhost ~]# cat /proc/mounts
//省略了一些其他挂载的目录
cgroup /cgroup/cpuset cgroup rw,relatime,cpuset 0 0
cgroup /cgroup/cpu cgroup rw,relatime,cpu 0 0
cgroup /cgroup/cpuacct cgroup rw,relatime,cpuacct 0 0
cgroup /cgroup/memory cgroup rw,relatime,memory 0 0
cgroup /cgroup/devices cgroup rw,relatime,devices 0 0
cgroup /cgroup/freezer cgroup rw,relatime,freezer 0 0
cgroup /cgroup/net_cls cgroup rw,relatime,net_cls 0 0
cgroup /cgroup/blkio cgroup rw,relatime,blkio 0 0
然而当你使用mount命令查看当前挂载信息的时候,你会发现是没有这些挂载信息的,这是因为mount命令只是会去查看/etc/mtab中的信息,将其显示出来,cgconfig挂载的时候,并没有使用mount命令去挂载。而是使用mount系统调用实现的,所以不会更新/etc/mtab文件,导致使用mount命令是查看不到挂载信息,但是/proc/mounts则是实时的。cgconfig固然很好用,但是知其所以然,还是需要知道下,怎么去手动创建Hierarchy,并令其生效。
Creating a Hierarchy and Attaching Subsystems
注:在做下面的实验之前请关闭cgconfig和cgred服务。创建一个Hierarchy很简单,只需要在/cgroup目录下,创建一个目录即可。重点是让其怎么生效。
让其生效的语法格式如下:
mount -t cgroup -o subsystems name /cgroup/name
[root@localhost ~]# mkdir /cgroup/cpu_and_mem //创建了一个Hierarchy
//挂载生效,并附加了cpu和cpuset两个子系统。
[root@localhost ~]# mount -t cgroup -o cpu,cpuset cpu_and_mem /cgroup/cpu_and_mem/
就这样一个Hierarchy创建完成并生效了。
Attaching Subsystems to, and Detaching Them From, an Existing Hierarchy
当Hierarchys生效了之后,如何再让这个Hierarchy附加或者剥离子系统呢?
通过mount命令的remount选项即可实现。
附加子系统
mount -t cgroup -o remount,cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem/
剥离子系统
mount -t cgroup -o remount,cpu cpu_and_mem /cgroup/cpu_and_mem/
注: 每附加一个子系统都会在cpu_and_mem目录中添加很多文件,每一个文件表示对应子系统的一些可调节参数,通过往这些文件中写入一些值来达到参数的调节。
Unmounting a Hierarchy
为了保证一个事物的完整生命周期,我不得不来说一下,如何关闭Hierarchy。还是很简单只要umount即可
[root@localhost ~]# umount /cgroup/cpu_and_mem/
到此为此,我们感性的认识了一下Hierarchy。接下来改说说 Control Group了
Control Group
在上文中,我们知道改如何去创建Hierarchy了,通过上篇博文我们知道,当创建Hierarchy的时候其实已经创建了了一个Control Group叫做root group,其表现形式就是一个目录,一个目录就是一个Control Group。在上文中cpu_and_mem就是root group。cgconfig也为我们提供了一个种便利的方式来创建Control Group。具体可以可以参考cgconfig文档。接下来我还是说一下如何去手动创建Control Group。
Creating Control Groups
cgcreate -t uid:gid -a uid:gid -g subsystems: path
- -t是可选的,用来指定用户或者组对这个cgroup的tasks伪文件的拥有权,仅允许
-t指定的用户或者组,往这个cgroup中添加tasks。 - -a是可选的,用来指定用户和组对这个cgroup的除了tasks外的其他伪文件的拥有权。用来修改cgroup中指定的tasks可以访问的系统资源。
- -g 指定要附加的子系统和Control Groups路径
example:
[root@localhost ~]# mkdir /cgroup/cpu_and_mem/
[root@localhost ~]# mount -t cgroup -o cpuset cpu_and_mem /cgroup/cpu_and_mem/
[root@localhost ~]# cgcreate -g cpuset:/subgroup
查看下/cgroup/cpu_and_mem/目录下多了一个subgroup目录,这就是一个control group。注意cgcreate中的-g指定的子系统只能是已经附加到这个Hierarchy中的子系统。如果你指定其他子系统则会报错。还有一个细节需要注意,请看如下案例:
//创建了两个层次,分别附加了两个不同的子系统。
[root@localhost ~]# mkdir /cgroup/cpu_and_mem/
[root@localhost ~]# mount -t cgroup -o cpuset cpu_and_mem /cgroup/cpu_and_mem/
[root@localhost ~]# mkdir /cgroup/memgroup
[root@localhost ~]# mount -t cgroup -o memory memgroup /cgroup/memgroup/
[root@localhost ~]# cgcreate -g cpuset:/subgroup
[root@localhost ~]# cgcreate -g cpuset,memory:/subgroup
查看下/cgroup/cpu_and_mem/和/cgroup/memgroup 你会发现在这两个目录中都有subgroup,那么意思就是说,cgcreate同时在两个层次中创建了control group。
总结下,cgcreate会根据-g后面指定的子系统,找到包含这些子系统的所有Hierarchy,并为其创建control group。
Removing Control Groups
移除Control Group就变得简单多了,但是仍然需要考虑一些问题。如果要移除的cgroup中还有子Control Group,那么需要使用进行递归删除。同样,删除的时候也要指定子系统,会根据子系统找到所有的Hierarchy 中的指定Control Group来删除
使用如下:
syntax:
cgdelete subsystems:path
example:
cgdelete cpuset,memory:/subgroup
Unloading Control Groups
cgclear是一个危险的命令,它可以删除系统上存在的所有Control Group报告root group。
Reference
Red_Hat_Enterprise_Linux-6-Resource_Management_Guide-en-US