##
 


http://www.cnblogs.com/lisperl/archive/2012/04/17/2453838.html

##
Cgroups是什么?

<font size="4" style="background-color: inherit;">Cgroups是<span style="font-family: Calibri; background-color: inherit;">control&nbsp;groups</span><span style="font-family: 宋体; background-color: inherit;">的缩写,是</span><span style="font-family: Calibri; background-color: inherit;">Linux</span><span style="font-family: 宋体; background-color: inherit;">内核提供的一种可以限制、记录、隔离进程组(</span><span style="font-family: Calibri; background-color: inherit;">process&nbsp;groups</span><span style="font-family: 宋体; background-color: inherit;">)所使用的物理资源(如:</span><span style="font-family: Calibri; background-color: inherit;">cpu,memory,IO</span><span style="font-family: 宋体; background-color: inherit;">等等)的机制。最初由</span><span style="font-family: Calibri; background-color: inherit;">google</span><span style="font-family: 宋体; background-color: inherit;">的工程师提出,后来被整合进</span><span style="font-family: Calibri; background-color: inherit;">Linux</span><span style="font-family: 宋体; background-color: inherit;">内核。</span><span style="font-family: Calibri; background-color: inherit;">Cgroups</span><span style="font-family: 宋体; background-color: inherit;">也是</span><span style="font-family: Calibri; background-color: inherit;">LXC</span><span style="font-family: 宋体; background-color: inherit;">为实现虚拟化所使用的资源管理手段,可以说没有</span><span style="font-family: Calibri; background-color: inherit;">cgroups</span><span style="font-family: 宋体; background-color: inherit;">就没有</span><span style="font-family: Calibri; background-color: inherit;">LXC</span><span style="font-family: 宋体; background-color: inherit;">。</span></font>

##
Cgroups可以做什么?

<font size="4" style="background-color: inherit;">Cgroups<span style="font-family: 宋体; background-color: inherit;">最初的目标是为资源管理提供的一个统一的框架,既整合现有的</span><span style="font-family: Calibri; background-color: inherit;">cpuset</span><span style="font-family: 宋体; background-color: inherit;">等子系统,也为未来开发新的子系统提供接口。现在的</span><span style="font-family: Calibri; background-color: inherit;">cgroups</span><span style="font-family: 宋体; background-color: inherit;">适用于多种应用场景,从单个进程的资源控制,到实现操作系统层次的虚拟化(</span>OS&nbsp;Level&nbsp;Virtualization)。<span style="font-family: Calibri; background-color: inherit;">Cgroups</span><span style="font-family: 宋体; background-color: inherit;">提供了一下功能:</span></font>

<font size="4" style="background-color: inherit;">1.限制进程组可以使用的资源数量(Resource&nbsp;limiting&nbsp;)。比如:<span style="font-family: Calibri; background-color: inherit;">memory</span><span style="font-family: 宋体; background-color: inherit;">子系统可以为进程组设定一个</span><span style="font-family: Calibri; background-color: inherit;">memory</span><span style="font-family: 宋体; background-color: inherit;">使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发</span><span style="font-family: Calibri; background-color: inherit;">OOM</span><span style="font-family: 宋体; background-color: inherit;">(</span><span style="font-family: Calibri; background-color: inherit;">out&nbsp;of&nbsp;memory</span><span style="font-family: 宋体; background-color: inherit;">)。</span></font>

<font size="4" style="background-color: inherit;">2.进程组的优先级控制(Prioritization&nbsp;)。比如:可以使用<span style="font-family: Calibri; background-color: inherit;">cpu</span><span style="font-family: 宋体; background-color: inherit;">子系统为某个进程组分配特定</span><span style="font-family: Calibri; background-color: inherit;">cpu&nbsp;share</span><span style="font-family: 宋体; background-color: inherit;">。</span></font>

<font size="4" style="background-color: inherit;">3.记录进程组使用的资源数量(Accounting&nbsp;)。比如:可以使用<span style="font-family: Calibri; background-color: inherit;">cpuacct</span><span style="font-family: 宋体; background-color: inherit;">子系统记录某个进程组使用的</span><span style="font-family: Calibri; background-color: inherit;">cpu</span><span style="font-family: 宋体; background-color: inherit;">时间</span></font>

<font size="4" style="background-color: inherit;">4.进程组隔离(I<span style="font-family: Calibri; background-color: inherit;">solation</span><span style="font-family: 宋体; background-color: inherit;">)。比如:使用</span><span style="font-family: Calibri; background-color: inherit;">ns</span><span style="font-family: 宋体; background-color: inherit;">子系统可以使不同的进程组使用不同的</span><span style="font-family: Calibri; background-color: inherit;">namespace</span><span style="font-family: 宋体; background-color: inherit;">,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。</span></font>

<font size="4" style="background-color: inherit;">5.进程组控制(C<span style="font-family: Calibri; background-color: inherit;">ontrol</span><span style="font-family: 宋体; background-color: inherit;">)。比如:使用</span><span style="font-family: Calibri; background-color: inherit;">freezer</span><span style="font-family: 宋体; background-color: inherit;">子系统可以将进程组挂起和恢复。</span></font>

##
Cgroups相关概念及其关系

###
相关概念

<font size="4" style="background-color: inherit;">1.<span style="font-family: 宋体; background-color: inherit;">任务(</span><span style="font-family: Calibri; background-color: inherit;">task</span><span style="font-family: 宋体; background-color: inherit;">)。在</span><span style="font-family: Calibri; background-color: inherit;">cgroups</span><span style="font-family: 宋体; background-color: inherit;">中,任务就是系统的一个进程。</span></font>

<font size="4" style="background-color: inherit;">2.<span style="font-family: 宋体; background-color: inherit;">控制族群(</span><span style="font-family: Calibri; background-color: inherit;">control&nbsp;group</span><span style="font-family: 宋体; background-color: inherit;">)。控制族群就是一组按照某种标准划分的进程。</span><span style="font-family: Calibri; background-color: inherit;">Cgroups</span><span style="font-family: 宋体; background-color: inherit;">中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用</span><span style="font-family: Calibri; background-color: inherit;">cgroups</span><span style="font-family: 宋体; background-color: inherit;">以控制族群为单位分配的资源,同时受到</span><span style="font-family: Calibri; background-color: inherit;">cgroups</span><span style="font-family: 宋体; background-color: inherit;">以控制族群为单位设定的限制。</span></font>

<font size="4" style="background-color: inherit;">3.<span style="font-family: 宋体; background-color: inherit;">层级(</span><span style="font-family: Calibri; background-color: inherit;">hierarchy</span><span style="font-family: 宋体; background-color: inherit;">)。控制族群可以组织成</span><span style="font-family: Calibri; background-color: inherit;">hierarchical</span><span style="font-family: 宋体; background-color: inherit;">的形式,既一颗控制族群树。控制族群树上的子节点控制族群是父节点控制族群的孩子,继承父控制族群的特定的属性。</span></font>

<font size="4" style="background-color: inherit;">4.<span style="font-family: 宋体; background-color: inherit;">子系统(</span><span style="font-family: Calibri; background-color: inherit;">subsytem</span><span style="font-family: 宋体; background-color: inherit;">)。一个子系统就是一个资源控制器,比如</span><span style="font-family: Calibri; background-color: inherit;">cpu</span><span style="font-family: 宋体; background-color: inherit;">子系统就是控制</span><span style="font-family: Calibri; background-color: inherit;">cpu</span><span style="font-family: 宋体; background-color: inherit;">时间分配的一个控制器。子系统必须附加(</span><span style="font-family: Calibri; background-color: inherit;">attach</span><span style="font-family: 宋体; background-color: inherit;">)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。</span></font>

###
相互关系

<font size="4" style="background-color: inherit;">1.每次在系统中创建新层级时,该系统中的所有任务都是那个层级的默认&nbsp;<span style="font-family: Calibri; background-color: inherit;">cgroup</span><span style="font-family: 宋体; background-color: inherit;">(我们称之为&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">root&nbsp;cgroup&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">,此</span><span style="font-family: Calibri; background-color: inherit;">cgroup</span><span style="font-family: 宋体; background-color: inherit;">在创建层级时自动创建,后面在该层级中创建的</span><span style="font-family: Calibri; background-color: inherit;">cgroup</span><span style="font-family: 宋体; background-color: inherit;">都是此</span><span style="font-family: Calibri; background-color: inherit;">cgroup</span><span style="font-family: 宋体; background-color: inherit;">的后代)的初始成员。</span></font>

<font size="4" style="background-color: inherit;">2.一个子系统最多只能附加到一个层级。</font>

<font size="4" style="background-color: inherit;">3.一个层级可以附加多个子系统</font>

<font size="4" style="background-color: inherit;">4.一个任务可以是多个<span style="font-family: Calibri; background-color: inherit;">cgroup</span><span style="font-family: 宋体; background-color: inherit;">的成员,但是这些</span><span style="font-family: Calibri; background-color: inherit;">cgroup</span><span style="font-family: 宋体; background-color: inherit;">必须在不同的层级。</span></font>

<font size="4" style="background-color: inherit;">5.<span style="font-family: 宋体; background-color: inherit;">系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">cgroup&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">的成员。然后可根据需要将该子任务移动到不同的&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">cgroup&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">中,但开始时它总是继承其父任务</span>的<span style="font-family: Calibri; background-color: inherit;">cgroup</span><span style="font-family: 宋体; background-color: inherit;">。</span></font>

##
Cgroups子系统介绍

<font size="4" style="background-color: inherit;">blkio&nbsp;--&nbsp;<span style="font-family: 宋体; background-color: inherit;">这个子系统为块设备设定输入</span><span style="font-family: Calibri; background-color: inherit;">/</span><span style="font-family: 宋体; background-color: inherit;">输出限制,比如物理设备(磁盘,固态硬盘,</span><span style="font-family: Calibri; background-color: inherit;">USB&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">等等)。</span></font>

<font size="4" style="background-color: inherit;">cpu&nbsp;--&nbsp;<span style="font-family: 宋体; background-color: inherit;">这个子系统使用调度程序提供对&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">CPU&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">的&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">cgroup&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">任务访问。</span></font>

<font size="4" style="background-color: inherit;">cpuacct&nbsp;--&nbsp;<span style="font-family: 宋体; background-color: inherit;">这个子系统自动生成&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">cgroup&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">中任务所使用的&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">CPU&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">报告。</span></font>

<font size="4" style="background-color: inherit;">cpuset&nbsp;--&nbsp;<span style="font-family: 宋体; background-color: inherit;">这个子系统为&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">cgroup&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">中的任务分配独立&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">CPU</span><span style="font-family: 宋体; background-color: inherit;">(在多核系统)和内存节点。</span></font>

<font size="4" style="background-color: inherit;">devices&nbsp;--&nbsp;<span style="font-family: 宋体; background-color: inherit;">这个子系统可允许或者拒绝&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">cgroup&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">中的任务访问设备。</span></font>

<font size="4" style="background-color: inherit;">freezer&nbsp;--&nbsp;<span style="font-family: 宋体; background-color: inherit;">这个子系统挂起或者恢复&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">cgroup&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">中的任务。</span></font>

<font size="4" style="background-color: inherit;">memory&nbsp;--&nbsp;<span style="font-family: 宋体; background-color: inherit;">这个子系统设定&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">cgroup&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。</span></font>

<font size="4" style="background-color: inherit;">net_cls&nbsp;--&nbsp;<span style="font-family: 宋体; background-color: inherit;">这个子系统使用等级识别符(</span><span style="font-family: Calibri; background-color: inherit;">classid</span><span style="font-family: 宋体; background-color: inherit;">)标记网络数据包,可允许&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">Linux&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">流量控制程序(</span><span style="font-family: Calibri; background-color: inherit;">tc</span><span style="font-family: 宋体; background-color: inherit;">)识别从具体&nbsp;</span><span style="font-family: Calibri; background-color: inherit;">cgroup&nbsp;</span><span style="font-family: 宋体; background-color: inherit;">中生成的数据包。</span></font>

<font size="4" style="background-color: inherit;"><span style="line-height: 27px; background-color: inherit;">&nbsp;</span></font>

&nbsp;

&nbsp;

&nbsp;

<font color="#444444" face="宋体" size="4" style="background-color: inherit;">&nbsp;CentOS</font>

<font color="#444444" face="宋体" size="4" style="background-color: inherit;">启动Cgroups</font>


service cgconfig start
chkconfig cgconfig on



###

&nbsp;

systemctl start  cgconfig.service



 



systemctl enable cgconfig.service



###

&nbsp;

<font color="#444444" face="宋体" size="4" style="background-color: inherit;">在/cgroup,有如下文件夹,默认是多挂载点的形式,即各个子系统的配置在不同的子文件夹下</font>


# ls /cgroup/
blkio cpu cpuacct cpuset devices freezer memory net_cls