cover_image

容器进程的限制技术-Cgroup

三七互娱技术团队
2022年08月15日 10:25

一、导读

二、背景

三、目的

四、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对进程的限制


四、linux底层核心技术——cgoup

4.1 基本介绍

    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是系统内核级别,对所有的进程加以控制的功能。


只是容器将这个功能用到非常好。


继续滑动看下一个
三七互娱技术团队
向上滑动看下一个