00:00
大家好,我是男胖子,今天呢,我将会把手写大卡系列的最后一篇给录制完,然后整个系列的源码还有笔记我都上传到了giu还有微信公众号上面,大家可以下来的时候自己去。对照着源码去再去看一下,然后整个系列也是花了我比较多的精力,我想要个三年应该不太过分吧。OK,让我们现在步入正题,首先来介绍一下,嗯,C groups的概念,之前是我们通过网一些命名空间呢,我们达到了一个资源隔离的目的,但是这种资源隔离它不能够对硬件的使用资源去进行隔离,比如你对CPU的使用率或者是内存的使用率进行隔离,那内核提供的c groups这种技术呢,它就能够达到这种硬件资源使用隔离的目的。那它具体是一个什么功能呢?其实嗯,它的实现已经是内核帮我们完成呢,然后我们只需要借助内核提供的接口就行了,那内核是如何去暴露c groups的相关接口的,它是通过虚拟文件系统。
01:06
的方式,虚拟文件系统的API所提供的接口来暴露给我。我们来让我们。对,嗯,C的相关API去进行操作。所以我们就能够在整个Linux系统上面呢,去通过创建文件夹,然后去往文件里面去写入内容。从而。达到让CS去控制进程的目的。现在来让我们真正动手去感受一下c group所提供的这种硬件资源的能力情况。首先我登录到我的远程服务器上,远程服器上面去,然后呢,默认CBS的相关目录是在这个目录下面,如果你不能记住的话,你也可以通过命令去查看c group的挂载目录,然后在这个目录下面你可以去发现,嗯,它是有很多个文件夹的。其中文件夹呢,是包含了一些硬件资源的一些名称,像IOCPU,还有memory ne c就是拿来控制带宽的,就是这些目录呢,我们统一把它称作c group的一个子系统。
02:11
你可以发现他,嗯,各个子系统呢,它可以单独的去控制某些进程。每一个子系统它都能够去呃设置这个子系统要控制是要控制的是哪些进程,我先拿CPU去举例,我们进入到CPU的一个目录下面,可以看到的是在这个目录下面有这么些文件。那这些文件呢?因为是c group的一个第一层级,所以它默认的是管理的整个系统所有的一个进程,使用CPU的情况。然后我们现在要做的就是通过c groups。然后去控制特定的某一个进程使用的CPU,所以我需要先在这一层目录下面去建立一个文件夹。这里之前我已经建好了这个文件夹,所以它把这个文件夹已经存在了,为什么要建这个文件夹了?因为在每一个子系统当中的话,它的一个嗯,控制范围也是分层的,那这个乘积的概念就是按目录层级去划分的,负目录的层级是包含了子目录乘级的。
03:15
这种使用范围,使用资源的线程,然后我们进入到这个test目录,你可发现我们创建好一个目录之后呢,它会默认的在这个目录下面,就是内核会帮助我们默认的在这个目录下面去创建好另外一些文件。这些文件呢,都是呃,控制CPU相关的一些文件。然后可以看到现在我的一个呃,Test这个c group的CPU的c group目录下,它是没有去管控任何的进程的。我们看的看管控进程的话,可以去看tasks这个文件,也可以去看z group这个文件。通常我们需要往。呃,往这个C。
04:00
里面去加入管控进程的时候,我们是往test这个文件里面去加这个进程,加这个进程ID,加入进程ID之后,那这个进程ID就受到这个成绩的c group的管控。那与CPU相关的比较重要的两个文件呢?这里我就具体的讲一下这两个文件。第一个是。这个cpu.c FS period us,它是代表一个CPU运行的周期,因为CPU是按时间片去运行的,就进程,进程是按时间片去运行的,然后它每运行一个周期的,可能它就会涉及到CPU时间片的一个切换。那默认我们来看一下这个运行周期是多少。这里是以微秒为单位的,默认就是100毫秒。然后呢,这里还涉及到一个就是。呃,C FS quite us,这个是代表什么呢?这个是代表。这个C的进程,它能够使用的一个周期时长是多少?默认的这个周期时长是负一,负一呢就是代表不受限制,那如果我们把它设置成呃,比如说设置成一个。
05:07
5000。制成一个5万。我们把负一改成5万之后。那这样就代表我现在的这个CPU的相关的一个这个C的目录,那所管控的这个进程呢,它所在一个时间片,在一个CPU的运行周期以内,只能最多运行半个周期,因为它是。5万的一个微秒,然后我的CPU周期时长呢是10万,这里就限制了,最多只能使用5万个。CPU的运行时,五微秒的CPU运行时,那现在我还没。我的这个test目录下面去添加进程,所以我还需要去添加进程去看一下,呃,这里我直接把。当前这个霸进程给添加到。添加到太房录像。这样我就添加进去了,然后来看一下test,添加进去之后呢,我们现在要做的就是对我的在这个BA界面呢,我要去对系统去进行压测。
06:11
而去对CPU去进行压测,来看看现在呃CPU所使能使用的一个最大CPU究竟是多少。为什么我这里限制的一个是大起进程,然后我这里运行这个stress这个进程,Stress这个进程会受到限程呢?因为大起进程呢,它是stress这个进程的一个负进程,就是它进程如果受到了限制,那默认在启动子进程的时候呢,子进程也会去继承到这个C这个限制里面去。这里就是对CPG进行限制,呃。因为我的一个机器是一核的,所以我这里最多也只能是一核了。然后去进行60秒,然后我再开一个终端呢,我再开一个终端去看一下当前我的一个机器使用的一个CPU具体是多少。
07:01
可以看到它最多也就是在500这个地方,它就不能涨上去了,说明我们现在一个CC的CPU的一个C的设置,它就生效了。接着我们就来看一下。C groups是如何去对进程所使用的内存去进行限制,同样我们还是要去进入到内存的这个子系统里面,就第一层级的默认是管理的所有的呃,系统上面所有的进程,所以我们还是不会去动这个目录,我们还是建了一个test目录,这个目录我之前已经提前建好了。现在可以看到这个目录呢,现在是没有去,呃管理到任何进程的,所以我先把我的一个当前进程我给他加进去。好,当天进程加进去之后呢,我是不是要修改现在的文件呢,然后现在修改的,呃,文件呢,有关于内存限制的,就是我们去通过修改这个文件就可以去达到让这个c group的目录,它所管理的进程所使用的一个内存的最大限制,就是通过在这个文件,在这个文件里面所定义的这个长度了,然后我们限制成100兆,我们来修修改一下这个limits,它默认是一串很长的很长的数字。
08:31
我们把它修改成100兆,那修修改成100兆之后呢,我们再用stress给你去进行压测,嗯,因为我限制的是100兆,然后我申请200兆的内存,然后看一下这个申请这个命令能不能成功,然后可以看见它这里已经报错了,它这里提示的就是呃,我的这个stress这个进程没有启动起来,然后具体为什么没有启动起来呢?就是因为我限制了我的这个进程呢,它只能使用100兆的内存,但是我想去申请两两百兆的内存,然后就去,然后内核就会去拒绝这个进程的执行,我们可以通过这个OM control这个文件去看到我发生一个OM的一个次数。
09:22
可以发现,因为OM去杀掉我的一个进程的次数为一,而这个依然就是由于刚才我的stress这个进程他被杀死了,所以通过这个例子应该也能够感受到,就是。我们在使用c group去限制进程的CPU,去限制进程说使用的一个内存情况的时候呢,其实就是通过改。内核挂载的这个c group这个目录下面的某些文件,或者是我们去创建一些文件夹,因为在这些目录下面呢,是内核提供的这种虚拟文件系统接口,当你操作这些目录的时候呢,内核便知道了,你要你要去限制某个进程呢,你要去限制哪些资源了,所以他在内部,在内核内部它会做这些操作,而提供给应用层呢,就是很简单的一些创建资源,创建文件,删除文件,修改文件这种操作。
10:10
所以我们在代码里面去实现这group控制的时候呢,就相对来说比较轻松一点,现在来看一下我们的代码是如何写的,这节的代码呢,也是在前面几节的基础上去进行添加的,具体来说就是添加的两个方法,第一个就是c groups这个去配置一个默认的CS的一个呃文件。呃,本来呢,这个其实这种配置项呢,应该由外部的这种外部运行进程的时候,运行容器的时候通过参数传进来的,但是这里我为了让整个代码更加的间接,所以我直接直接的去配了一个默认的c group的一个配置,然后并且呢,在紫金城,这也就是我的一个容器,在结束的时候呢,我会去清理掉它所创建的这种S的文件。
11:04
那配置c group配置C这种功能呢,其实根据刚才的演示,你能发现呢,它就是在这个C这个挂载目录下面,它去创建的某些文件夹,他去创建了他去修改的某些文件。可以看到这些文件,这些文件名呢,都是刚才我们所演示的一些文件名了,那具体来说就是一个,嗯,创建文件夹,修改文件的一个操作。清理的这个动作呢,也比较容易,我们是用了一个呃,Cg delete这个命令,这个也是可以在呃也是相当于操作,也是内核,也是一个工具,C group相关一个工具所提供的一个命令,来帮助我们清理掉c groups的相关目录,它本质上呢,其实也就是将c group c group的相关目录给删除掉。这样就完成了。我们。呃,C group对进程的一个使用硬件资源的一个隔离,限制了它所使用的一个最大的一个硬件资源。
12:08
然后整个系列就在。就在今天这一讲就结束了。但是呢,其实你可以在。结束之后呢,可以对现有代码去进行拓展,因为我为了更简洁的去演示的原理呢,有些地方是没有去详细的展开的,就比如你如何去配置一个嗯,端口映射。这个其实这个其实是跟防火墙的一个nat的这种配置是有关的。然后又又比如我们现在打日志呢,它是呃,直接打在一个终端,让你去运行这么一个容器进程,但是你可以让你去运行的是一个前台进程,让你可以去修改现有代码,让你能够去用嗯,Tiny darker去启动一个后台运行的一个容器,并且呢,能够去进入到现有的这个后台运行容器的一个日志,总之你有了这些基础以后呢,你再去对比着大克尔现有的功能,你可以去思考它的功能是如何实现的,你要去做呃,怎么进一步的实现。
13:13
这样来说应该是比较容易的,因为呃,前面几节呢,包括这一节所讲的关于容器底层这些概念呢,可以说是现代原是现代容器建设的一个基础,那懂了这些以后,再来看相关的内容,可以变得更加容易一些,好,那今天就结束了。呃呃。
我来说两句