Docker-使用cgroups进行资源限制的原理
1:什么是Cgroups
- Cgroups是linux内核的一项功能,它主要是用来是进行资源(CPU,内存等)的限制
2:Cgroups功能
- 资源限制:限制资源的使用,例如我们可以通过限制某个业务的内存使用量,从而保护其它业务的正常运行
- 优先级控制:不同的组可以有不同的资源使用的优先级
- 审计:计算控制组的资源使用情况
- 控制:控制进程的挂起和恢复
3:cgroups功能的实现依赖于三个核心概念
- 子系统:是一个内核的组件,一个子系统代表一类资源调度控制器,例如内存子系统可以控制内存的使用量,CPU子系统可以限制CPU的使用时间
- 控制组:表示一组进程和一组带有参数的子系统的关联关系,例如:一个进程使用了内存子系统,那么这个进程和内存子系统的关联关系称为控制组
- 层级树:是由一系列的控制组按照树状结构排列组成的。这种排列方式可以使得控 制组拥有父子关系,子控制组默认拥有父控制组的属性,也就是子控制组会继承于父控制组。比 如,系统中定义了一个控制组 c1,限制了 CPU 可以使用 1 核,然后另外一个控制组 c2 想实现既 限制 CPU 使用 1 核,同时限制内存使用 2G,那么c2就可以直接继承 c1,无须重复定义CPU限制。
4:Docker是如何利用cgroups来进行资源限制的
- 事实上,Docker在创建容器时,Docker会在对应的cgroups子系统下创建以容器ID为名称的目录,然后根据容器启动时设置的参数,修改对应的cgroups子系统资源限制文件,从而达到资源限制的效果
5:结束语
- cgroups不仅为我们提供了资源限制,审计以及控制等功能,还可以为我们统计资源使用情况,容器监控系统的数据来源也是cgroups提供的
- 另外,要注意,虽然cgroups可以限制资源,但是不能保证资源的使用,意思是虽然我们给容器CPU设置为1核,但不保证总是能使用到1核CPU,当CPU发生竞争时,可能会导致实际的CPU资源产生竞争