Linux Control Groups

cgroups是基于内核的进程级资源(cpu,memory,disk I/O等)隔离工具,由google的工程师于2006年以kernel patch的形式提交。这个最早被叫做"Rohit Seth's containers patch"的功能始于Rohit Seth,现google架构组linux内核团队的资深经理(印度人),并由google工程师Paul Menage开发完善(Menage已于2011年离开google)。由于与kernel内现有的container概念冲突,在2007年晚些时候被改名为"control groups"并合入2.6.24版本。在此之前cgroups已经应用在google内部大量产品上,而且获得了显著的性能提升。

cgroups

Linux系统中所有进程都有一个父进程(最终都是init的子进程),因此Linux的进程是一种单一的层级结构。同时每个进程又会继承父进程的一些属性。cgroups与进程概念很相似,也是分层级的,且子cgroup会继承父cgroup的某些属性。但这里有一个区别就是cgoups的层级是多个的,并且互不影响。

首先介绍几个基本概念:

  • 层级(hierarchy):一个层级就是一组相关的cgroup,结构类似于进程层级结构,分父cgroup和子cgroup,一个系统内可以有多个层级
  • 控制组(cgroup):组成层级(hierarchy)的最小单位,注意本文中复数词态cgroups,一般代指整个软件,单数词态代指的是单个控制组
  • 任务(task):这里说的任务就是进程,每个控制组(cgroup)都可以包含若干任务
  • 子系统(subsystem):可以理解为资源分类,一个子系统往往对应一种资源,如cpu,memory等。每个子系统必须绑定到一个层级(hierarchy)上才能发挥作用。通过子系统的接口可以对某个具体的控制组(cgroup)设置资源限制

对这些基本概念有如下设定:

  • 一个subsystem只能附加到一个hierarchy中
  • 一个hierarchy可以附加一个或者多个subsystem
  • 一个操作系统可以包含多个hierarchy,每个hierarchy创建后,都会有一个root cgroup,当前系统内的所有任务都自动加入到root cgroup中
  • 一个任务可以属于多个cgroup,这多个cgroup必须属于不同的hierarchy,即如果一个task成为同一hierarchy中第二个cgroup的成员,就会自动将其从第一个cgroup中删除
  • 子进程(task)会自动加入到父进程所在的cgroup,但之后可以将子进程从当前cgroup中移走

在实现上,cgroups通过Linux虚拟文件系统对外提供接口。这种方式不仅具有友好的接口,便于用户的管理与信息的交互;而且会发现cgoups的层次结构与文件系统的树形结构天然相对应。但对系统管理员来说,cgroups提供了更加友好的工具包libcgroup,该软件包包含大量与cgroup相关的命令行工具,可以通过shell命令挂载cgroups层级同时设置相应参数。接下来将简单介绍一下使用过程,目的只是为了给出一个更加直观的印象,完整信息可以参考[1]。另笔者使用的是ubuntu,发现其上cgroups的使用与RHL有所区别,但这不影响所要表达的内容。

修改配置文件/etc/cgconfig.conf中的配置,格式如:

subsystem = path/hierarchy

创建两个层级分别叫做cpu和cpuacct,将子系统cpu附加到层级cpu上,将子系统cpuacct附加到层级cpuacct上:

mount {
    cpu     = /mnt/cgroups/cpu;
    cpuacct = /mnt/cgroups/cpuacct;
}

重启cgroups服务,会发现层级cpu和cpuacct已经挂载成功

$ sudo service cgconfig restart
Stopping cgconfig service:  * 
Starting cgconfig service:  *
$ ls /mnt/cgroups/
cpu cpuacct

下面显示了/mnt/cgroups/cpu文件夹内都包含哪些东西。文件tasks每一行都是一个进程id,代表附加在当前cgroup上的task,而文件cpu.*代表了子系统cpu的参数配置情况。

$ ls -l
total 4
drwxr-xr-x 3 root root    0 2013-01-02 16:48 ./
drwxr-xr-x 5 root root 4096 2013-01-02 16:48 ../
-r--r--r-- 1 root root    0 2013-01-02 16:48 cgroup.procs
-rw-r--r-- 1 root root    0 2013-01-02 16:48 cpu.rt_period_us
-rw-r--r-- 1 root root    0 2013-01-02 16:48 cpu.rt_runtime_us
-rw-r--r-- 1 root root    0 2013-01-02 16:48 cpu.shares
-rw-r--r-- 1 root root    0 2013-01-02 16:48 notify_on_release
-rw-r--r-- 1 root root    0 2013-01-02 16:48 release_agentdrwxr
-xr-x 2 root root    0 2013-01-02 16:48 sysdefault/
-rw-r--r-- 1 root root    0 2013-01-02 16:48 tasks

/mnt/cgroups/cpu内有一个文件夹sysdefault,其内容与文件夹/mnt/cgroups/cpu内的非常相似,而其中的tasks文件包含了大量的进程id(几乎是当前系统的所有进程id)。事实上sysdefault是root cgroup的子cgroup,而系统配置几乎将当前所有的task都附加在了这个cgroup上。

很显然父cgroup和子cgroup的层级关系表示为树形的父文件夹与子文件夹的关系,而cgroup中附加的子系统或者任务都通过regular文件接口的形态展示,可以直接通过修改文件内容来更改子系统参数或者添删任务。另外libgroup提供了cgcreatecgdeletecgsetcggetcgclassifycggred等众多命令行工具来简化对cgroups的操作,有兴趣的读者可以翻阅相应的手册。

Application

正如设计之初的名字"container"表达的含义一样,croups是一种资源隔离技术,能精确地控制进程级的资源使用,同时也为虚拟化提供了资源管理手段,其作为一种高效的解决方案已经应用在多种技术场景中。

  • 如迅速发展的LXC(Linux Container)就是基于cgroups之上的轻量级内核虚拟化技术
  • hadoop中通过cgroups对mapper和reducer使用的资源进行控制,防止过度消耗资源导致机器挂掉
  • 使用cgroups对一台机器上的多个mysql实例进行cpu,memory,io的隔离

Reference

[1] RHL6 Resource Management Guide

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值