Cgroups资源隔离

 

Cgroups资源隔离,是Linux内核中很重要的一块以内容

1.Cgroups是什么?

Cgroups是Linux内核提供的一种机制,这种机制可以根据需求把一系列系统任务以及其子任务整合到按资源划分等级的不通组内,从而为系统资源管理提供一个统一的框架。通俗地说,cgroups可以限制、记录任务组所使用的物力资源,为容器的虚拟化提供了基本保证,是构建Docker等一些列虚拟化管理工具的基石。

2.Cgroups有如下几个特点

(1)cgroupsde API以一个为文件系统的方式实现,用户态的程序可以通过文件操作实现cgroups的组织管理

(2)cgroups的组织管理操作单元可以细粒度到线程的级别

(3)所有资源管理的功能都能以子系统的方式实现,实现接口统一

(4)子任务创建之初与其父任务处于同一个cgroups控制

3. Cgroups有如下几个功能

(1)资源限制。可以对任务使用的资源总额进行限制

(2)优先级分配。通过分配的CPU时间片数量及磁带IO带宽大小,可以控制任务运行的优先级

(3)资源统计。cgroups可以统计系统的资源使用量

(4)任务控制。cgroups可以对任务执行挂起、回复等操作

4.Cgroups的术语表

(1)task(任务),表示系统的一个进程或线程

(2)cgroup(控制组),cgroups中的资源控制都以cgroup为单位来实现

(3)subsystem(子系统),cgroups中的子系统就是一个资源调度控制器

(4)hierarchy(层级),层级由一系列cgroup以一个树状结构排列而成,每个层级通过绑定对应子系统进行资源控制。

5.Cgroups的规则

(1)同一个层级可以附加到一个或多个子系统。如下图所示:

Cgroups资源隔离

 

(2) 一个子系统可以附加到多个层级,当且仅当目标层级只有唯一一个子系统时。其中,如果B么有附加过内存子系统,那么CPU子系统同时附加到两个层级是允许的。

Cgroups资源隔离

 

(3) 系统每次新建一个层级时,该系统上面所有的任务默认加入这个新建层级的初始化cgroup,这个cgroup被称为root cgroup,并且对于创建的每一个层级,任务只能存在于其中一个cgroup。

Cgroups资源隔离

(4)任务在fork/clone自身时创建的子任务默认与原任务在同一个cgroup中,但是子任务允许被移动到不同的cgroup中。

Cgroups资源隔离

6.子系统介绍

子系统是cgroups的资源控制系统,每种子系统独立地控制一种资源,目前Docker中使用了以下9种子系统

(1)blkio,为块设备设定输入/输出限制

(2)cpu,使用调度程序控制对CPU的使用

(3)cpuacct,自动生成cgroup中任务对cpu资源使用情况的报告

(4)cpuset,可以为cgroup中的任务分配独立的cpu和内存

(5)devices,可以开启或者关闭cgroup中任务对设备的访问、

(6)freezer,可以挂起或回复cgroup中的任务

(7)memory,可以设定cgroup中任务对内存使用量的限定,并且自动生成对内存资源使用情况的报告

(8)perf_event,使用后使cgroup中的任务可以进行统一的性能测试

(9)net_cls,通过使用等级识别符标记网络数据包,从而允许Linux流量控制程序识别具体cgroup中生成的数据包

 

7.cgroups实现方法以及工作原理简介

(1)cgroups如何判断资源超限,以及超限之后会做出什么措施?对于不同的系统资源,cgroups提供了统一的接口对资源进行控制和统计,当进程在申请更多对应的资源时,就会触发cgroup用量检测,超过规定的限额之后,就会拒绝用户的资源申请。当超过最大值时,如果设置了超过最大限制的操作,则执行该操作;如果没有则进程会被挂起,进入到睡眠状态,一直到资源足够为止。

(2)cgroup与任务之间的关系。实现上,cgroup与任务之间是多对多的关系,所以他们并不直接关联,而是通过一个中间结构把双向相关的关联信息记录起来。