zoukankan      html  css  js  c++  java
  • CGroup 介绍、应用实例及原理描述

    CGroup 介绍

      CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。2007 年进入 Linux 2.6.24 内核,CGroups 不是全新创造的,它将进程管理从 cpuset 中剥离出来,作者是 Google 的 Paul Menage。CGroups 也是 LXC 为实现虚拟化所使用的资源管理手段。

    • CGroup 功能及组成

      CGroup 是将任意进程进行分组化管理的 Linux 内核功能。CGroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为 CGroup 子系统或控制器。CGroup 子系统有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等。运行中的内核可以使用的 Cgroup 子系统由/proc/cgroup 来确认。

    CGroup 提供了一个 CGroup 虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用 CGroup,必须挂载 CGroup 文件系统。这时通过挂载选项指定使用哪个子系统。

    • CGroup 支持的文件种类
                                表 1. CGroup 支持的文件种类
    文件名R/W用途

    Release_agent

    RW

    删除分组时执行的命令,这个文件只存在于根分组

    Notify_on_release

    RW

    设置是否执行 release_agent。为 1 时执行

    Tasks

    RW

    属于分组的线程 TID 列表

    Cgroup.procs

    R

    属于分组的进程 PID 列表。仅包括多线程进程的线程 leader 的 TID,这点与 tasks 不同

    Cgroup.event_control

    RW

    监视状态变化和分组删除事件的配置文件

    • CGroup 相关概念解释
    1. 任务(task)。在 cgroups 中,任务就是系统的一个进程;

    2. 控制族群(control group)。控制族群就是一组按照某种标准划分的进程。Cgroups 中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用 cgroups 以控制族群为单位分配的资源,同时受到 cgroups 以控制族群为单位设定的限制;

    3. 层级(hierarchy)。控制族群可以组织成 hierarchical 的形式,既一颗控制族群树。控制族群树上的子节点控制族群是父节点控制族群的孩子,继承父控制族群的特定的属性;

    4. 子系统(subsystem)。一个子系统就是一个资源控制器,比如 cpu 子系统就是控制 cpu 时间分配的一个控制器。子系统必须附加(attach)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。

    【备注】

       子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源,目前,redhat默认支持10个子系统,但默认只挂载了8个子系统,ubuntu 12.04 默认支持8个子系统,但默认只挂载了5个子系统。

    下面对每一个子系统进行简单的介绍:

    1. blkio设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。【block io】

    2. cpu使用调度程序为cgroup任务提供cpu的访问。

    3. cpuacct产生cgroup任务的cpu资源报告。

    4. cpuset如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。

    5. devices允许或拒绝cgroup任务对设备的访问。

    6. freezer暂停和恢复cgroup任务。

    7. memory设置每个cgroup的内存限制以及产生内存资源报告。

    8. net_cls标记每个网络包以供cgroup方便使用。

    9. ns名称空间子系统。

    10. perf_event增加了对每group的监测跟踪的能力,即可以监测属于某个特定的group的所有线程以及             运行在特定CPU上的线程,此功能对于监测整个group非常有用,具体参见 http://lwn.net/Articles/421574/

    相互关系

    1. 每次在系统中创建新层级时,该系统中的所有任务都是那个层级的默认 cgroup(我们称之为 root cgroup,此 cgroup 在创建层级时自动创建,后面在该层级中创建的 cgroup 都是此 cgroup 的后代)的初始成员;

    2. 一个子系统最多只能附加到一个层级;

    3. 一个层级可以附加多个子系统;

    4. 一个任务可以是多个 cgroup 的成员,但是这些 cgroup 必须在不同的层级;

    5. 系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在 cgroup 的成员。然后可根据需要将该子任务移动到不同的 cgroup 中,但开始时它总是继承其父任务的 cgroup。

      

    图 1 所示的 CGroup 层级关系显示,CPU 和 Memory 两个子系统有自己独立的层级系统,而又通过 Task Group 取得关联关系。

    • CGroup 特点
    1. 在 cgroups 中,任务就是系统的一个进程。

    2. 控制族群(control group)。控制族群就是一组按照某种标准划分的进程。Cgroups 中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用 cgroups 以控制族群为单位分配的资源,同时受到 cgroups 以控制族群为单位设定的限制。

    3. 层级(hierarchy)。控制族群可以组织成 hierarchical 的形式,既一颗控制族群树。控制族群树上的子节点控制族群是父节点控制族群的孩子,继承父控制族群的特定的属性。

    4. 子系统(subsytem)。一个子系统就是一个资源控制器,比如 cpu 子系统就是控制 cpu 时间分配的一个控制器。子系统必须附加(attach)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。

    图 2. CGroup 典型应用架构图

      如图 2 所示,CGroup 技术可以被用来在操作系统底层限制物理资源,起到 Container 的作用。图中每一个 JVM 进程对应一个 Container Cgroup 层级,通过 CGroup 提供的各类子系统,可以对每一个 JVM 进程对应的线程级别进行物理限制,这些限制包括 CPU、内存等等许多种类的资源。下一部分会具体对应用程序进行 CPU 资源隔离进行演示。

    [实例参见]http://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html

    不过在开始实例之前首先安装cgroup

      ubuntu14.04 安装           sudo apt-get install cgroup-bin

      查看系统支持的子系统类型数量: $ cd /proc 

                      $ lssubsys

      挂载的子系统在/sys/fs/cgroup/

    e.g.

      1.在memory下面建立一个test.              #mkdir test

        在该文件夹内会自动生成好多文件

      详细介绍在http://www.tuicool.com/articles/ArimMz  

    然后将一个线程写入tasks中,就可以对该线程进行memory管控了。

        echo pid >> tasks;

    【参考】

      1.http://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html

      2.http://my.oschina.net/cloudcoder/blog/424418?p=1

     子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源,目前,redhat默认支持10个子系统,但默认只挂载了8个子系统,ubuntu 12.04 默认支持8个子系统,但默认只挂载了5个子系统。

  • 相关阅读:
    php socket 读取缓存区域
    PHP依赖注入的作用
    谷歌浏览器调试文字都变成font标签的解决方法
    php socket 同步异步堵塞非堵塞的区别
    css3中background-size中的cover与contain的区别
    css3 line-height:0的作用
    RDD的创建方式
    Serializable序列化操作解惑
    SparkCore分布式计算模拟
    spark不同环境下计算pi值
  • 原文地址:https://www.cnblogs.com/plxx/p/5129245.html
Copyright © 2011-2022 走看看