CGroup概述 (简介 组织结构和基本规则)

  • Post author:
  • Post category:其他




CGroup简介

CGroup是 Control Groups 的简称,通俗的来说,cgroups 可以限制、记录、隔离进程组所使用的物理资源(包括:CPU、memory、IO 等),为容器实现虚拟化提供了基本保证,是构建 Docker 等一系列虚拟化管理工具的基石。

CGroup主要有四大功能:

资源限制(Resource Limitation):cgroups 可以对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出 OOM(Out of Memory)。

优先级分配(Prioritization):通过分配的 CPU 时间片数量及硬盘 IO 带宽大小,实际上就相当于控制了进程运行的优先级。

资源统计(Accounting): cgroups 可以统计系统的资源使用量,如 CPU 使用时长、内存用量等等,这个功能非常适用于计费。

进程控制(Control):cgroups 可以对进程组执行挂起、恢复等操作

要了解CGroup,就要了解一些术语:

task(任务), cgroup(控制组),subsystem(子系统),hierarchy(层级树)


task:

task就是表示系统的一个进程。


cgroup:

资源控制的单位,表示一整个任务组,每个任务组被划分相应的资源,包含了一个或者多个子系统。一个任务既可以加入到这个 cgroup 中,也可以迁移到另外一个 cgroup 中去。


subsystem:

一个资源调度器(Resource Controller,控制着CPU,内存,访问,输入输出等资源和权限。


hierarchy:

一种操作系统的组织结构,可以理解为是一个 cgroup 树,将 cgroup 串成树状结构,通过虚拟端口暴露给用户。



subsystem

子系统是 cgroup 对进程组进行资源控制的具体行为,通过不同的子系统调控资源的调动,subsystem 按照某种对应关系附加到 hierarchy 上, cgroup 提供统一的洪湖街口,使得 cgroup 在上层是一个统一的框架,而在下层实现各种资源的控制,具体子系统 有如下几种:

  1. cpu子系统:该子系统为每个进程组设置一个使用CPU的权重值,以此来管理进程对cpu的访问。

  2. cpuset子系统:对于多核cpu,该子系统可以设置进程组只能在指定的核上运行,并且还可以设置进程组在指定的内存节点上申请内存。

  3. cpuacct子系统:该子系统只用于生成当前进程组内的进程对cpu的使用报告。

  4. memory子系统:该子系统提供了以页面为单位对内存的访问,比如对进程组设置内存使用上限等,同时可以生成内存资源报告

  5. blkio子系统:该子系统用于限制每个块设备的输入输出。首先,与CPU子系统类似,该系统通过为每个进程组设置权重来控制块设备对其的I/O时间;其次,该子系统也可以限制进程组的I/O带宽以及IOPS。

  6. devices子系统:通过该子系统可以限制进程组对设备的访问,即该允许或禁止进程组对某设备的访问。

  7. freezer子系统:该子系统可以使得进程组中的所有进程挂起。

  8. net-cls子系统:该子系统提供对网络带宽的访问限制,比如对发送带宽和接收带宽进程限制。

在这里插入图片描述



hierarchy

cgroup 是一个进程组,最开始可能所有进程都在一个进程组中,然后根据对于资源需求的不同,逐渐分出子进程组,然后根据资源,继续细分,最后变成一个 cgroup 层级结构。

在这里插入图片描述



组织结构

在上面对于各组件的简介基本上已经可以看出不同组件之间的联系,以下是各组件之间的联系规则:

  1. 同一个 hierarchy 可以附加一个或多个 subsystem,如图:

在这里插入图片描述

2. 一个 subsystem 可以附加到多个 hierarchy,当且仅当这个 hierarchy 只有这一个subsystem ,如下图,因为 hierarchy 2 中已有一个 subsystem ,所有 hierarchy 中的 subsystem 不能附加到 hierarchy 2 中去:

在这里插入图片描述

3. 一个 task 不能属于同一个 hierarchy 的不同 cgroup:

在这里插入图片描述

  1. fork 出的子进程在初始状态与其父进程处于同一个 cgroup。进程(task)在 fork 自身时创建的子任务(child task)默认与原 task 在同一个 cgroup ,但之后这个子任务可以被移动到其他的 cgroup 中去,可以理解为这个子任务是独立的一个进程,如图:

在这里插入图片描述

参考资料:


https://blog.csdn.net/qccz123456/article/details/90768509?biz_id=102&utm_term=cgroup%20hierarchy%20层级树&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-3-90768509&spm=1018.2118.3001.4187


https://blog.csdn.net/woniu_slowly/article/details/38317973



版权声明:本文为Fitz_q原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。