深入CGroup框架--基础篇

cGroup是Linux系统中用于进程资源控制的机制,它将进程组织成树状结构,通过子系统如CPU、内存、设备等对资源进行限制、优先级分配和统计。cGroup在系统启动时初始化,每个进程与一个css_set关联,css_set包含了进程所属的cgroups信息。子系统如cpu、cpuacct、cpuset分别用于CPU时间分配、CPU资源报告和CPU/Memory资源分配。使用cGroup可以通过创建子目录或使用libcgroup库来管理进程资源限制。

CGroup 全称是 Control Group,顾名思义,它是用来做“控制”的。控制什么东西呢?当然是资源的使用了。那它都能控制哪些资源的使用呢?本章主要进行总结,主要涉及到以下方面

  • what:什么是cgroup以及cgroup的内核实现
  • why: 能解决什么问题
  • How: 如何使用cgroup

1. 什么是cgroup

cgroup是Linux下的一种将进程按组进行管理的机制,在用户层看来,cgroup技术就是把系统中的所有进程组织成一颗一颗独立的树,每棵树都包含系统的所有进程,树的每个节点是一个进程组,而每颗树又和一个或者多个subsystem关联,树的作用是将进程分组,而subsystem的作用就是对这些组进行操作。cgroup主要包括下面几部分:

  • 任务(task:在cgroups中,任务就是系统的一个进程。
  • 控制族群(coontrol group): 就是一组按照某种标准划分的进程。Cgroups中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用cgroups以控制族群为单位分配的资源,同时受到cgroups以控制族群为单位设定的限制。
  • subsytem: 就是一个内核模块,他被关联到一颗cgroup树之后,就会在树的每个节点(进程组)上做具体的操作。Linux支持12种subsystem,比如限制CPU的使用时间,限制使用的内存,统计CPU的使用情况,冻结和恢复一组进程等。
  • hierarchy: 一个hierarchy可以理解为一棵cgroup树,树的每个节点就是一个进程组,每棵树都会与零到多个subsystem关联。

对于其框架如下图所示

在这里插入图片描述

我们把每种资源叫做子系统,比如CPU子系统,内存子系统。为什么叫做子系统呢,因为它是从整个操作系统的资源衍生出来的。然后我们创建一种虚拟的节点,叫做cgroup,然后这个虚拟节点可以扩展,以树形的结构,有root节点,和子节点。这个父节点和各个子节点就形成了层级(hierarchiy)。每个层级都可以附带继承一个或者多个子系统,就意味着,我们把资源按照分割到多个层级系统中,层级系统中的每个节点对这个资源的占比各有不同。

支持的 subsystem 如下( cat /proc/cgroups)

  • blkio - 可对块设备的输入/输出访问设定限制。
  • cpu - 可以调整控制组群任务的完全公平调度程序(CFS)调度程序的参数。它与 cpuacct 控制器在相同的挂载中一起挂载。
  • cpuacct - 创建控制组群中任务使用的 CPU 资源自动报告。它与 cpu 控制器在相同的挂载中一起挂载。
  • cpuset - 可以用来限制控制组任务只在指定的 CPU 子集中运行,并指示任务仅在指定内存节点上使用内存。
  • devices - 可控制控制组群中任务访问设备。
  • freezer - 可以用来挂起或恢复控制组群中的任务。
  • memory - 可以用来设置控制组群中任务使用的内存限值,并生成有关这些任务使用的内存资源的自动报告。
  • net_cls - 使用类标识符(classid)的标签网络数据包可让 Linux 流量控制器( tc 命令)识别来自特定控制组群任务的数据包。net_cls 的子系统 net_filter (iptables),也可以使用此标签对此类数据包执行操作。net_filter 标签带有防火墙标识符(fwid),允许 Linux 防火墙(通过 iptables 命令)识别来自特定控制组群任务的数据包。
  • net_prio - 设置网络流量的优先级。
  • pids - 可为控制组群中的很多进程及其子进程设定限制。
  • perf_event - 可使用 perf 性能监控和报告工具对任务进行分组。
  • rdma - 可以在控制组群中设置 Remote Direct Memory Access/InfiniBand 特定资源的限制。
  • hugetlb - 可用于根据控制组群中的任务限制大量虚拟内存页面的使用。

按照资源的划分,系统被划分成了不同的子系统(subsystem),正如我们上面列出的cpu, cpuset, blkio…每种资源独立构成一个subsystem.
可以将cgroup的架构抽象的理解为多根的树结构,一个hierarchy代表一棵树,树上绑定一个或多个subsystem.而树的叶子则是cgroup,一个cgroup具体的限制了某种资源。一个或多个cgroup组成一个css_set。简单来讲,就是一个资源限制集合(css_set)对一种subsystem(cpu,devices)的限制条件只能有一个,这是显然的吧…最终的task(进程)同css_set关联,从而达到限制资源的目的

可以通过查看当前系统支持哪些subsystem

在这里插入图片描述

从左到右,字段的含义分别是:

  • subsys_name: subsystem的名字
  • hierarchy: subsystem所关联到cgroup树的ID,如果多个system关联到同一颗cgroup,那么它们的那个字段将一样。比如这里的cpu和cpuacct就一样,表示他们绑定到了同一颗树。如果出现下面的情况,这个字段将为0:
    • 当前subsystem没有和任何cgroup树绑定
    • 当前subsystem已经和cgroup v2的树绑定
    • 当前subsystem没有被内核开启
  • num_cgroups: subsystem所关联的cgroup树中进程组的个数,也即树上节点的个数
  • enabled: 1表示开启,0表示没有被开启(可以通过设置内核的启动参数“cgroup_disable”来控制subsystem的开启)

2. cgroup解决什么

从实现角度来看,cgroups实现了一个通用的进程分组框架,不同资源的具体管理工作由各cgroup子系统来实现,当需要多个限制策略比如同时针对cpu和内存进行限制,则同时关联多个cgroup子系统即可。实现 cgroups 的主要目的是为不同用户层面的资源管理提供一个统一化的接口。从单个任务的资源控制到操作系统层面的虚拟化,cgroups 提供了四大功能:

  • 资源限制:cgroups 可以对任务是要的资源总额进行限制。比如设定任务运行时使用的内存上限,一旦超出就发 OOM。
  • 优先级分配:通过分配的 CPU 时间片数量和磁盘 IO 带宽,实际上就等同于控制了任务运行的优先级。
  • 资源统计:cgoups 可以统计系统的资源使用量,比如 CPU 使用时长、内存用量等。这个功能非常适合当前云端产品按使用量计费的方式。
  • 任务控制:cgroups 可以对任务执行挂起、恢复等操作。

3. 源码分析

3.1. 数据结构

先从进程的角度,来剖析cgroups相关的数据结构之间的关系

task_struct结构

Linux 中,管理进程的数据结构是 task_struct,其中与 cgroups 有关的是如下两个成员:

#ifdef CONFIG_CGROUPS
	/* Control Group info protected by css_set_lock */
	struct css_set __rcu *cgroups;
	/* cg_list protected by css_set_lock and tsk->alloc_lock */
	struct list_head cg_list;
#endif
成员 含义
cgroups 指向了一个css_set结构,而css_set存储了与进程相关的cgroups信息
cg_list 将使用同一个css_set的进程链接在一起

css_set 结构

struct css_set {
   
   
    //引用计数,gc使用,如果子系统有引用到这个css_set,则计数+1
	atomic_t refcount;
    //所有的`css_set`组成一个`hash`表
	struct hlist_node hlist;
    //将所有的task连起来。mg_tasks代表迁移的任务
	struct list_head tasks;
	struct 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值