Docker核心原理——cgroups


发布于 2016-06-11 / 17 阅读 / 0 评论 /
Docker通过cgroups实现资源限制

Docker基本原理:Docker通过namespace实现资源隔离,通过cgroups实现资源限制,通过写时复制机制(copy-on-write)实现了高效的文件操作。

1.cgroups、任务、子系统、层级四者间的关系及其基本规则

共有以下四条基本规则。

(1)同一层级可附加一个或多个子系统

(2)一个子系统可以附加到多个层级,当且仅当目标层级只有唯一一个子系统。即一个已经附加在某个层级上的子系统不能附加到其他含有别的子系统的层架

(3)系统每次新建一个层级时,该系统上的所有任务默认加入这个新建层级的cgroup,这个cgroup称为root cgroup

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

2.子系统

子系统实际上是cgroups的资源控制系统,每种子系统独立控制一种资源。目前,Docker有如下9种子系统:

(1)blkio:块设备输入/输出,比如物理驱动(比如磁盘、固态硬盘、USB等)。

(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:Docker未直接使用它,通过使用等级识别符(classid)标记网络数据包,从而允许Linux流量控制程序(Traffic Control,TC)识别具体cgroup中生成的数据包。

cgroup表现为一个文件系统,需要mount才能使用,命令为“mount -t cgroup”,挂载成功后,可看到各类子系统,一般在/sys/fs/cgroup/目录下。

3./sys/fs/cgroup/cpu/docker/<container-id>/目录下文件的作用

一个cgroup创建完成,不管绑定了何种系统,其目录下都会生成以下几个文件,用来描述cgroup的相应信息

(1)tasks:罗列所有该cgroup中任务的TID,即进程或线程ID。把一个任务的TID写入这个文件就意味着把这个任务加入到这个cgroup中。

(2)cgroup.procs:罗列所有在该cgroup中的TGID,即线程组ID。

(3)notify_on_release:0或1,表示是否在cgroup中最后一个任务退出时通知运行release agent,默认为0,表示不运行。

(4)release_agent:指定release agent执行脚本的文件路径,该文件在最顶层cgroup目录中存在,这个脚本通常用于自动化卸载无用的cgroup。