CGroup文档

一、CGroup简述

1、定义

CGroup 是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物力资源的机制:它以分组的形式对进程使用系统资源的行为进行管理和控制。即用户可以通过CGroup对所有进程进行分组,再对该分组整体进行资源的分配和控制。

2、组成与基础概念

2.1 control group 控制族群

一组按照某种标准划分的进程,任何资源控制都以其为单位实现。
一个进程组的进程可以使用 cgroups 以控制族群为单位分配的资源,同时受到 cgroups 以控制族群为单位设定的限制。

2.2 task 任务

即一个进程

2.3 hierarchy 层级树

控制族群可以组织成 hierarchical 的形式,即一棵控制族群树。
在树中包含所有进程,每个进程属于一个节点,树的每一个节点为一个进程组。
同样的每棵树会与零个或多个子系统相关联

如果新挂载的cgroup关联的hierachy与系统中存在的hierarchy完全一样,那么cgroupfs会拒绝挂载。如果没有匹配到相同的hierarchy,但新挂载hierachy声明的资源正在被已经存在的hierarchy使用,挂载会报-EBUSY错误。

2.4 subsystem 子系统

cgroup提供的是一种机制,而具体的策略是通过子系统来完成的,具体的资源管理功能称为 CGroup 子系统,具有有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等,即资源控制器
此外,一个子系统必须附加到一个层级上才可以起作用,同时也只能附加到一个层级上,相反,一个层级可以附加多个子系统。此外一个进程可以作为多个Cgroup的成员,但Cgroup必须在不同的层级树下。

2.5 CGroup 虚拟文件系统:进行分组管理和各子系统设置的用户接口

2.6 层级图

在这里插入图片描述
我们来总结上述概念之间的关系,在不同层级之间通过Task Group取得联系,但二者本身具有独立性,Cgroup附加到层级上并形成一个控制族群树。

二、原理的简单分析

我们尝试从源码的角度来考虑:

1、task_struct

在 Linux 中,管理进程的数据结构是 task_struct
其中

#ifdef CONFIG_CGROUPS 
/* Control Group info protected by css_set_lock */ 
struct css_set *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 是一个嵌入的 list_head 结构,用于将连到同一个 css_set 的进程组织成一个链表。

在 css_set 特别需要关注的是struct_cg_cgroup_link
Subsys 是一个指针数组,存储一组指向 cgroup_subsys_state 的指针。一个 cgroup_subsys_state 就是进程与一个特定子系统相关的信息。通过指针数组,进程可以获得相应的 cgroups 控制信息了。
cgroup 指针指向了一个 cgroup 结构,因此进程就通过
task_struct->css_set->cgroup_subsys_state->cgroup连接

2、cgroup结构

struct cgroup { 
unsigned long flags; 
atomic_t count; 
struct list_head sibling; 
struct list_head children; 
struct cgroup *parent; 
struct dentry *dentry; 
struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; 
struct cgroupfs_root *root;
struct cgroup *top_cgroup; 
struct list_head css_sets; 
struct list_head release_list; 
struct list_head pidlists;
struct mutex pidlist_mutex; 
struct rcu_head rcu_head; 
struct list_head event_list; 
spinlock_t event_list_lock; 
};

sibling,children 和 parent 三个嵌入的 list_head 负责将统一层级的 cgroup 连接成一棵 cgroup 树。
top_cgroup 指向了所在层级的根 cgroup,也就是创建层级时自动创建的那个 cgroup

3、cg_cgroup_link

cgroup 和 css_set 是一个多对多的关系,存在一个中间结构cg_cgroup_link来将两者联系起来。

struct cg_cgroup_link { 
struct list_head cgrp_link_list; 
struct cgroup *cgrp; 
struct list_head cg_link_list; 
struct css_set *cg; };

至此我们可以简单的明晰了Cgroup的原理概念

评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符 “速评一下”
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页