cgroup的学习(一)——what cgroup? && (二)——cgroup框架结构

本序列文章将介绍cgroup概念,cgroup框架,cgroup的子系统

 

What Cgroup?

      Control Groups provide a mechanism foraggregating/partitioning sets of tasks, and all their future children, intohierarchical groups with specialized behaviour.--http://www.kernel.org/doc/Documentation/cgroups/cgroups.txt,从这个定义我们可以大概的知道:Cgroup是对set of tasks进行管理,并且同样作用于它们的children,即它们是一个hierarchical关系,在一个hierarchical内它们的行为是一致的。那么cgroup到底提供了那些功能?我们通过图1来简单说明一下。

alt
图1

       从图1中,以可看到该cgroup支持:cpuset,ns,cpu,cpuacct,memory等子系统,hierarchy代表hierarchy id,从图中亦可以看到cpuset,cpu,memory,blkio被mount到同一个hierarchy 14。下面我们简单的介绍更子系统的作用:
Cpuset:用于指定tasks使用的cpu及memory nodes,等价于sched_setaffinity,set_mempolicy的效果;
Ns:命名空间服务;
Cpu:用于设置tasks对cpu的利用率;
Cpuacct:用于记录cpu的统计信息;
Memory:用于设置tasks对内存的使用量;
Devices:用于设置tasks对devices的使用(whitelist,read,write,mknod);
Freezer:用于挂起或恢复tasks;
Net_cls:使用等级识别符(classid)标记网络数据包,允许linux流量控制(tc)识别从具体cgroup中生成的数据包;
Blkio:控制并监控tasks对块设备的I/O访问;
注:更详细的解说见:https://access.redhat.com/knowledge/docs/zh-CN/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/index.html

 

简单使用及注意事项

       通过/proc/cgroups可以查看系统支持的cgroup子系统(也可以用来判断系统是否支持cgroup,如果hierarchy项非0说明相应的子系统已经被mount,此时如果再mount这个子系统到其它的目录就可能提示busy错误)。然后将所需要的cgroup子系统mount到/cgroup目录:mount –t cgroup –o cpu,cpuset,memory,blkio agent_cgroup /cgroup,该过程也是创建一个hierarchy,此时如果提示:mount: agent already mounted or /cgroup busy则可以通过lssubsys –m memory来查询对应的子系统被mount到哪个目录,然后一一排查,是否需要把原来的subsys先umount(umount前要求把子系统目录下的group依次从底层删除掉,最后才再umount才能够保证umount真正成功,否则如果直接umount虽然目录没有了,但其实并没有umount成功,通过/proc/cgroup可以看到它的hierarchy项还是非0,此时就需要再把这个子系统mount到一个目录,然后依次把没有rmdir的目录给先删除掉,再umount)。
      创建一个cgroup,在刚才mount的目录下,创建目录:mkdir /cgroup/cg_test,即创建了一个cgroup(该操作对应的操作为rmdir,只有把cgroup内的tasks移到top group才能真正将一个cgroup删除掉),此时可以看到新目录下已经有许多文件了。
      然后修改相应的这些伪文件内容echo 512 > /cgroup/cg_test/cpu.shares,即完成对该cgroup的配置。
      最后往这个cgroup中加入task:echo pid > /cgroup/cg_test/cpu.tasks或cgexec(注:如果想把某个task从某个group移出的话,只需将它放入root的tasksecho pid > /cgroup/tasks)。
      就这么简单,但是上面的操作都是需要root权限,并且到现在内核还没有提供相应的api接口,只能这种文件读写的方式,或者是相应的工具来实现。这4个过程也是我们后面分析cgroup的所有内容。

========================

 

cgroup学习(二)——cgroup框架结构

分类: linux   4人阅读  评论(0)  收藏  编辑  删除
cgroup框架结构

这一章里,我们先整体介绍一个cgroup的框架结构,以及cgroup文件系统的相应文件定义。这里我们先看一下cgroup的主要结构关系:

 

alt
图2 主要数据结构关系

该图包含了cgroup的所有主要数据结构及它们的关系。其中cgroupfs_root相当于我们mount操作指定的dir;cgroup表示在mount目录下的mkdir cg_test;而cgroup_subsys则是所有subsys的基类(-o选项),它定义了所有subsys的相应方法,及属性;cgroup_subsys_state是cgroup管理的subsys的group控制体的抽象类(这个名字有点别扭,看了后面可能就会明白),每个子系统有自己实现类如cpuset,task_group,mem_cgroup等,即cgroup_subsys_state实现C语言的多态,cgroup只管理cgroup_subsys_state这个结构,而不同的子系统根据这个结构,通过container_of来还原出自己的真正控制体;cg_cgroup_link则定义着cgroup与css_set的多对多关系(一个css_set为什么会有多个cgroup?——其根本的原因在于一个task会被attach到多个hierarchy,并且在每个hierarchy下的必有一个cgroup管理着该task(一个task只有一个css_set),所以有几个hierarchycss_set就有几个cgroup。一个cgroup为什么会有多个css_set?——因为一个cgroup可以attach多个进程,而这些进程它们的css_set可能不一样,这个由该task所属的cgroups决定,只有所属的cgroups完全一样,它们才会共享一个css_set,否则的话,它们的css_set就不一样),css_set->cg_links指向所有管理了该css_set的cgroup(这些cgroup由cg_cgroup_link->cg_link_list链接起来的cg_cgroup_link),同理cgroup->css_sets指向所有该cgroup管理的css_set(这些css_set由cg_cgroup_link->cgrp_link_list链接起来的cg_cgroup_link),加入一个这样的中间结构其原因主要是解除css_set与cgroup之间的耦合关系(考虑在两者直接连接的情况下,如果我们要删除cgroup的操作,及多加了这个结构的相应操作?)。所有的css_set保存在css_set_table的全局哈希表里,它们的hash函数及key为css_set_hash(css_set->subsys);css_set则建立task与它的一对多关系,不一样的进程可能指向同一个css_set(如刚fork的父子进程),而css_set->tasks则是所有引用该css_set的tasks的list的head,task之间用task->cg_list进行链接;同样的,一个cgroupfs_root的所有cgroup_subsys由cgroupfs_root->subsys_list组织;所有的cgroupfs_root通过它的root_list连接到roots这个全局变量头里。
     通过该图我们可以知道cgroup内并没有保存task的list,那么我们查看tasks文件的时候(cat tasks)是怎么获得它的所有tasks?——cgroup->css_sets保存了所有它管理的css_set(通过cg_cgroup_link连接),另外css_set->tasks保存了所有引用它的tasks(该过程对应于cgroup_tasks_open);同样的,当我们cat /proc//cgroup的时候可以查看到一个task被哪些cgroup管理,这个过程是通过task->cgroups获得它的css_set,然后再从css_set->cg_links(通过cg_cgroup_link连接)获得它所属的cgroup(该过程相对应于cgroup_open->proc_cgroup_show->task_cgroup_from_root,实际的代码过程跟分析有点不一样,是由于输出要求按root区分,但依据的关系是一样的)。
注:我们mount之后其实已经产生了一个top cgroup,即它本身既是cgroupfs_root也是一个cgroup。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值