聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

cgroup笔记-cgroup简介

2015-10-05 13:35 浏览: 1484982 次 我要评论(0 条) 字号:






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)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。

可用的子系统

  • blkio — 这​​​个​​​子​​​系​​​统​​​为​​​块​​​设​​​备​​​设​​​定​​​输​​​入​​​/输​​​出​​​限​​​制​​​,比​​​如​​​物​​​理​​​设​​​备​​​(磁​​​盘​​​,固​​​态​​​硬​​​盘​​​,USB 等​​​等​​​)。
  • cpu — 这​​​个​​​子​​​系​​​统​​​使​​​用​​​调​​​度​​​程​​​序​​​提​​​供​​​对​​​ CPU 的​​​ cgroup 任​​​务​​​访​​​问​​​。​​​
  • cpuacct — 这​​​个​​​子​​​系​​​统​​​自​​​动​​​生​​​成​​​ cgroup 中​​​任​​​务​​​所​​​使​​​用​​​的​​​ CPU 报​​​告​​​。​​​
  • cpuset — 这​​​个​​​子​​​系​​​统​​​为​​​ cgroup 中​​​的​​​任​​​务​​​分​​​配​​​独​​​立​​​ CPU(在​​​多​​​核​​​系​​​统​​​)和​​​内​​​存​​​节​​​点​​​。​​​
  • devices — 这​​​个​​​子​​​系​​​统​​​可​​​允​​​许​​​或​​​者​​​拒​​​绝​​​ cgroup 中​​​的​​​任​​​务​​​访​​​问​​​设​​​备​​​。​​​
  • freezer — 这​​​个​​​子​​​系​​​统​​​挂​​​起​​​或​​​者​​​恢​​​复​​​ cgroup 中​​​的​​​任​​​务​​​。​​​
  • memory — 这​​​个​​​子​​​系​​​统​​​设​​​定​​​ cgroup 中​​​任​​​务​​​使​​​用​​​的​​​内​​​存​​​限​​​制​​​,并​​​自​​​动​​​生​​​成​​​由​​​那​​​些​​​任​​​务​​​使​​​用​​​的​​​内​​​存​​​资​​​源​​​报​​​告​​​。​​​
  • net_cls — 这​​​个​​​子​​​系​​​统​​​使​​​用​​​等​​​级​​​识​​​别​​​符​​​(classid)标​​​记​​​网​​​络​​​数​​​据​​​包​​​,可​​​允​​​许​​​ Linux 流​​​量​​​控​​​制​​​程​​​序​​​(tc)识​​​别​​​从​​​具​​​体​​​ cgroup 中​​​生​​​成​​​的​​​数​​​据​​​包​​​。​​​
  • ns — 名​​​称​​​空​​​间​​​子​​​系​​​统​​​。​​​

    作为数据库通常比较关注的是,blkio,cpuset,memory三个子系统。

相互关系

  1. 每次在系统中创建新层级时,该系统中的所有任务都是那个层级的默认 cgroup(我们称之为 root cgroup,此 cgroup 在创建层级时自动创建,后面在该层级中创建的 cgroup 都是此 cgroup 的后代)的初始成员;
  2. 一个子系统最多只能附加到一个层级;
  3. 一个层级可以附加多个子系统;
  4. 一个任务可以是多个 cgroup 的成员,但是这些 cgroup 必须在不同的层级;
  5. 系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在 cgroup 的成员。然后可根据需要将该子任务移动到不同的 cgroup 中,但开始时它总是继承其父任务的 cgroup。

图 1. 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 资源隔离进行演示。


CGroup 部署及配置介绍

安装cgroup

rhel系统使用

yum install libcgroup

cgconfig服务

安装后会生成cgconfig服务,使用

service cgconfig status –查看服务状态

service cgconfig stop –停止服务

service cgconfig start –开启服务

service cgconfig restart –重启服务

lssubsys -am –也可以使用这个命令查看子系统的挂载情况

/etc/cgconfig.conf配置文件

cgconfig.conf配置文件有两个区块,一个是mount,一个是group,先来看看mount.
默认的内容如下:

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;
}

代表执行了以下命令:

mkdir /cgroup/cpu

mount -t cgroup -o cpu cpu /cgroup/cpu

....

group的语法如下

group <name> {
[<permissions>]
<controller> {
    <param name> = <param value>;
    …
}
…
}

permissions部分是可选的,如果你是作为管理员(root)给相关程序授权,可以忽略这个选项。

group mysql_g1 {
perm {
    task {
        uid = root;
        gid = mysql;
    } admin {
        uid = root;
        gid = root;
    }
}
    cpuset {
        cpuset.cpus = "3";
        cpuset.mems = "0";
}
    memory {
        memory.limit_in_bytes=104857600;
        memory.swappiness=0;
        # memory.max_usage_in_bytes=104857600;
        # memory.oom_control=0;
}
    blkio  {
       blkio.throttle.read_bps_device="8:0 524288";
       blkio.throttle.write_bps_device="8:0 524288";
}
}

这是一个常用的mysql cgroup配置文件,限制了cpuset,memory和blkip三个子系统。

我们详细看看配置文件.类似执行了如下命令

mkdir -p /cgroup/cpu/mysql_g1

chown root:root /cgroup/cpu/mysql_g1/*

chown root:mysql /cgroup/cpu/mysql_g1/tasks

echo 3 > /cgroup/cpuset/mysql_g1/cpuset.cpus

修改配置文件以后,可以使用

service cgconfig restart –来使配置生效

将某个或者多个进程加入到某个子系统中。

cgclassify -g cpu,memory:group1 1701

cgclassify 的​​​语​​​法​​​为​​​:cgclassify -g subsystems:path_to_cgroup pidlist,其​​​中​​​:

  • subsystems 是​​​用​​​逗​​​号​​​分​​​开​​​的​​​子​​​系​​​统​​​列​​​表​​​,或​​​者​​​ * 启​​​动​​​与​​​所​​​有​​​可​​​用​​​子​​​系​​​统​​​关​​​联​​​的​​​层​​​级​​​中​​​的​​​进​​​程​​​。​​​请​​​注​​​意​​​:如​​​果​​​在​​​多​​​个​​​层​​​级​​​中​​​有​​​同​​​名​​​的​​​ cgroup,则​​​ -g 选​​​项​​​会​​​将​​​该​​​进​​​程​​​移​​​动​​​到​​​每​​​个​​​组​​​群​​​中​​​。​​​请​​​确​​​定​​​在​​​拥​​​有​​​您​​​在​​​此​​​指​​​定​​​子​​​系​​​统​​​的​​​每​​​个​​​层​​​级​​​中​​​都​​​有​​​该​​​ cgroup。​​​
  • path_to_cgroup 是​​​到​​​其​​​层​​​级​​​中​​​的​​​ cgroup 的​​​路​​​径​​​
  • pidlist 是​​​用​​​空​​​格​​​分​​​开​​​的​​​进​​​程​​​识​​​别​​​符​​​(PID)列​​​表​​​
  • 您​​​还​​​可​​​以​​​在​​​ pid 前​​​面​​​添​​​加​​​ –sticky 选​​​项​​​以​​​保​​​证​​​所​​​有​​​子​​​进​​​程​​​位​​​于​​​同​​​一​​​ cgroup 中​​​。​​​如​​​果​​​您​​​没​​​有​​​设​​​定​​​这​​​个​​​选​​​项​​​且​​​ cgred 守​​​护​​​进​​​程​​​正​​​在​​​运​​​行​​​,则​​​会​​​根​​​据​​​ /etc/cgrules.conf 中​​​的​​​设​​​置​​​将​​​子​​​进​​​程​​​分​​​配​​​到​​​ cgroup 中​​​。​​​该​​​进​​​程​​​本​​​身​​​则​​​仍​​​保​​​留​​​在​​​启​​​动​​​它​​​的​​​ cgroup 中​​​。​​​
    上面命令类似执行了

echo 1701 > /cgroup/lab1/group1/tasks

cgred守护进程

cgred是​​​一​​​个​​​守​​​护​​​进​​​程​​​,它​​​可​​​根​​​据​​​在​​​ /etc/cgrules.conf 文​​​件​​​中​​​设​​​定​​​的​​​参​​​数​​​将​​​任​​​务​​​移​​​动​​​到​​​ cgroup 中​​​。​​​/etc/cgrules.conf 文​​​件​​​中​​​的​​​条​​​目​​​可​​​以​​​使​​​用​​​以​​​下​​​两​​​个​​​格​​​式​​​之​​​一​​​:

  • user hierarchies control_group
  • user:command hierarchies control_group

      *:/usr/local/mariamysql/bin/mysqld * mysql_g1
    

这里的实例代表任何用户启动的mysqld进程,都包含到所有已经挂载的子系统的mysql_g1组中。

查看哪些系统在cgroup中运行

ps -eo pid,cgroup,cmd | grep -i mysqld

查看某个控制组群可以设置哪些参数

cgget -g cpuset / –cpuset可以替换成其他控制组群名称

cgroup 命​​​令​​​最​​​权​​​威​​​的​​​文​​​档​​​是​​​ libcgroup 软​​​件​​​包​​​提​​​供​​​的​​​手​​​册​​​页​​​。​​​这​​​部​​​分​​​的​​​数​​​字​​​在​​​以​​​下​​​ man page 列​​​表​​​中​​​指​​​定​​​。​​​

libcgroup Man Page

  • man 1 cgclassify — cgclassify 命​​​令​​​是​​​用​​​来​​​将​​​运​​​行​​​的​​​任​​​务​​​移​​​动​​​到​​​一​​​个​​​或​​​者​​​多​​​个​​​ cgroup。​​​
  • man 1 cgclear — cgclear 命​​​令​​​是​​​用​​​来​​​删​​​除​​​层​​​级​​​中​​​的​​​所​​​有​​​ cgroup。​​​
  • man 5 cgconfig.conf — 在​​​ cgconfig.conf 文​​​件​​​中​​​定​​​义​​​ cgroup。​​​
  • man 8 cgconfigparser — cgconfigparser 命​​​令​​​解​​​析​​​ cgconfig.conf 文​​​件​​​和​​​并​​​挂​​​载​​​层​​​级​​​。​​​
  • man 1 cgcreate — cgcreate 在​​​层​​​级​​​中​​​创​​​建​​​新​​​ cgroup。​​​
  • man 1 cgdelete — cgdelete 命​​​令​​​删​​​除​​​指​​​定​​​的​​​ cgroup。​​​
  • man 1 cgexec — cgexec 命​​​令​​​在​​​指​​​定​​​的​​​ cgroup 中​​​运​​​行​​​任​​​务​​​。​​​
  • man 1 cgget — cgget 命​​​令​​​显​​​示​​​ cgroup 参​​​数​​​。​​​
  • man 5 cgred.conf — cgred.conf 是​​​ cgred 服​​​务​​​的​​​配​​​置​​​文​​​件​​​。​​​
  • man 5 cgrules.conf — cgrules.conf 包​​​含​​​用​​​来​​​决​​​定​​​何​​​时​​​任​​​务​​​术​​​语​​​某​​​些​​​ cgroup 的​​​规​​​则​​​。​​​
  • man 8 cgrulesengd — cgrulesengd 在​​​ cgroup 中​​​发​​​布​​​任​​​务​​​。​​​
  • man 1 cgset — cgset 命​​​令​​​为​​​ cgroup 设​​​定​​​参​​​数​​​。​​​
  • man 1 lscgroup — lscgroup 命​​​令​​​列​​​出​​​层​​​级​​​中​​​的​​​ cgroup。​​​
  • man 1 lssubsys — lssubsys 命​​​令​​​列​​​出​​​包​​​含​​​指​​​定​​​子​​​系​​​统​​​的​​​层​​​级​​​。​​​

查看各子系统可以调节的参数请链接到此地址

cgroup子系统可以调节参数




网友评论已有0条评论, 我也要评论

发表评论

*

* (保密)

Ctrl+Enter 快捷回复