今天在看Docker技术实现的时候,看到了Cgroup这个技术,原先没有深入了解Docker怎么实现资源隔离也没有怎么关注过。这次看到了Cgroup,那么顺便也记录Cgroup这个技术。
第一次接触Cgroup
第一次接触到Cgroup是去年在一家公司做大数据程序,有部分程序实现的代码需要把部署在服务器上的程序与C语言程序进行系统资源隔离分开。
避免两个程序进行资源的争夺导致其他程序失败,我们在实现的过程中就是采用的Cgroup。
什么是Cgroup
Cgroup是Linux内核提供的一种可以限制,记录,隔离进程组所使用的物力资源的机制。
作者是Goolge的Paul Menage,为LXC实现虚拟化所采用的 的资源管理手段。
其实Cgroup是从Linux的进程管理中的cpuset剥离出来的。
功能及组成
Cgroup 能够将进程进行分组然后进行管理I/O,内存的分配,CPU的使用等等,这些资源管理功能称为Cgroup的子系统或者控制系统。
内核使用Cgroup子系统由/proc/cgroup确认.
在想使用这些分组管理以及子系统,那么在系统中需要挂载CGroup的文件系统。
支持的子系统如下:
文件名称 | 读与写 | 用途 |
---|---|---|
Task | 读与写 | 设置分组的线程的列表 |
Cgroup.procs | 读 | 属于分组的进程PID列表,包含多线程进程的线程leader的TID |
enent_control | 读与写 | 监视状态变化和分组删除事件的配置文件 |
概念解释
- 任务:系统的一个子进程。
- control group 控制族群。按照某一个标准出现的进程组。
- 层级:金字塔结构,底层继承父层的属性限制。
- 子系统:一个子系统就是资源控制器。子系统加入到某个层级以后,层级上的所有控制族群都受到子系统的控制。
架构图
从架构图中我们可以看到该技术是用在操作系统的底层上的,起到Container的作用。
Docker也利用了CGroup
我们在系统上建立多个容器,并且使用run 参数设置cpu,内存等信息。其实机制也是利用了CGroup技术来达到的实现。
为什么我们要限制资源?
如果我们在一个系统级别上创立了很多种容器。并且都没有对容器进行资源的限制。
当使用这些容器运行时,就可能出现资源竞争的情况,并且可能存在某个容器把资源抢光的情景。
这就是CGroup需要做的事情了,进行资源的隔离。