一、导读
二、背景
三、目的
四、linux底层核心技术——cgoup
4.1 基本介绍
4.2 使用方法
五、实验:通过cgroup来限制进程的CPU使用率
cpu.cfs_period_us
cpu.cfs_quota_us
5.1 实验目的
5.2 实验效果
六、总结
1. 本文所讲的环境是容器运行的宿主机为linux系统,探讨Linux如何限制容器的资源,如CPU, 内存,网络等。
2. 容器使用资源的限制,底层技术用的是cgroup组,是Linux内核级别的功能,使用方法是准备好cgroup环境(如何限制)后,将容器进程pid加入到cgoup即可。
3. Cgroup不是容器的专属,所有Linux系统上的进程都可以使用cgroup来进行资源的控制。
容器技术已在全世界如火如荼地流行起来,在使用容器过程中,如何使容器不会抢占太多的系统资源,避免因占用资源过多而拖垮整个系统。从而保障系统整体的稳定性,限制容器进程是其最重要的核心技术之一。
使用的方法大致可以理解为:启动linux容器,加上限制参数,仅允许容器使用指定的资源,如512Mi内存,0.3 CPU,即可达到限制的效果。而它的底层用的正是系统内核Cgroup
探讨cgroup技术的原理,掌握cgroup的使用方法
通过一个实验来感受cgoup对进程的限制
Cgroup 全称是control groups,是Linux 内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、网络、磁盘IO等)
它是由 Google开发的,在2008年1月正式发布的Linux内核v2.6.24开始提供此能力
Cgroup基本术语
Cgroup提供了四个功能
Cgoup除了对进程使用的资源进行限制,还提供了优先级分配,资源统计,进程控制的功能。
查看当前系统所支持子系统
从以上cgroup的基本术语中可以看到,subsystem(子系统)是资源调度控制器,也就是cgroup对进程控制的具体实现,我们也是从这里知道它具体支持哪些功能。
通过 cat /proc/cgroups 查看当前系统支持的subsystem, 即资源调度控制器。
上述查询到的各子系统提供的具体功能
4.2 使用方法
把进程放到组里面,对组设置权限,即可对进程进行控制。
可以理解为用户和组的概念和关系,用户加入到某个用户组后,会受到用户组的权限控制;进程pid加入到group task里,就会受到group对资源
的限制。
用户id --> 用户组id
进程pid-->cgroup task
五、实验:通过cgroup来限制进程的CPU使用率
本文开头提到,cgroup不是容器的专属,而是所有进程都可以使用的内核级别的功能,以下我们就通过一个小实验来看看cgroup是如何限制一个
进程的。
本实验选用以上subsystem中最简单的 一个,也是最容易理解的subsystem: cpu,它的功能是用来限制CPU的使用率。
5.1 实验目的
限制进程使用25%的CPU
5.2 实验过程
5.2.1 创建测试的cgroup
进入到 /sys/fs/cgroup/cpu 目录,也就是子系统cpu的所在地,创建一个目录testlimit后,我们会发现:系统会自动帮我们创建好所有cpu子系统
的参数文件
以上的参数非常多,由于我们的实验目的是限制进程的CPU使用率,因此,我们只需要关注这2个控制文件
cpu.cfs_quota_us: 默认值是100000, 单位是微秒,可以理解为控制cpu使用的时间是按100000微秒一个周期。
cpu.cfs_period_us: 默认值是-1,单位是微秒。-1 表示不受限制,而我们要控制cpu使用率为25%,就是要设置好这个参数。
查看当前的配
我们前面讲到,使用25%的CPU, 实际上是允许进程使用的CPU时间为 一个周期内的25%,当前默认情况下,一个周期是100000微秒,25%周期
是 100000 * 25% = 25000 微秒
即 25000 /100000 = 25%, 所以我们应该将 cpu.cfs_quota_us的值改为 25000
准备好限制的参数后,我们需要让CPU占满100%
方法:写个死循环,让当前的bash进程迅速占满CPU
开始限制CPU使用率,将进程pid 加到上述 testlimit组里
5.2 实验效果
查看效果
bash进程对CPU的使用率迅速降了下来,降为 25% 左右。
达到预期效果
六、总结
cgroup通过是内核级别的控制组,通过将pid加入到指定的cgroup组里,即可达到对进程的限制。
容器的本质也是一个进程,而cgroup面向所有的进程,容器也不例外。
linux系统对容器限制的过程:
1. 容器启动前:设置好相应的cgroup参数;
2. 容器启动后:将容器进程pid写入到group task里
综上:本文在介绍容器进程底层是通过Cgoup实现对资源控制的基础上,从cgroup支持的功能和完成cgroup限制CPU的小实验这两个方面,说明Cgroup是系统内核级别,对所有的进程加以控制的功能。
只是容器将这个功能用到非常好。