Cgroup基本使用

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

发布了116 篇原创文章 · 获赞 64 · 访问量 19万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览