00:00
欢迎大家收看上硅谷的Linux云计算视频,大家好,我是万阳老师。那之前的课程中呢,我们已经学习过了刀相关的,从我们的技术命令,多容器管理,镜像管理,包括仓库管理和我们所谓的数据的持久化,那这节课呢,我们去学习资源限制。默认情况下呢,Dock里面的进程会尽可能的去榨干我们当前操作系统的所有的资源,CPU啊,内存啊,包括我们的磁盘O啊,对吧?但是如果我们的容器内部的某个进程出现了一定的问题,对吧,那它会无休止的去向我们的外部的操作系统首要资源,最终可能会陷,造成我们的结果就是容器关闭啊,或者是竞争关闭啊等等一些比较恶心的这么一些故障。所以对于真正的生态环境来说呢,容器的资源限制是必须需要去做的这么一件事情。
01:01
那这节课呢,我们就去好好的学习一下,好,那首先这节课的篇章呢,我们会分为这么几个部分,对吧?第一个从我们的内存资源限制开始讲起,再讲我们的CPU资源限制,那当然我们刚才刚才也提到了,在我们的刀客里面,它限制的方式还有可以通过我们的IO去限制,但一般来说限制我们的磁盘IO没有什么太大的含义,自己有兴趣的话可以去简单的查一查即可,那基本上我们用的不太多,原因是我们真正的数据存储的目录一般都是远程挂载过来了,根本不需要去限制它的磁盘lo,这种磁盘后它也限制不了,需要大家注意一下,好,第三种呢,我们可以通过一些。限制实验给大家讲一下,看我们之前设置的一些参数到底有没有作用,对吧?好,那这是我们分为的三个篇章,我们先从第一个开始去讲解,那第一个呢,我们把它叫内存的资源限制,那首先我们要看一些重点的一些知识点,对吧?第一个我们c group在这里会提到了一个新的名词叫c group。
02:07
C group叫ctrl group叫什么控制组对吧?这个东西怎么去理解呢?或者它是干嘛的呢?先给大家简单讲一下,它就是我们的刀客里面真正去限制每个不同的容器,它的使用资源大小的这么一个底层技术,它是Linux内核提供的。好。可以限制记录隔离进程组,那我们之前也说过对吧?在我们的Linux里面,Doc每一个不同的容器相当于就是每一个不同的进程,对于外部的数组机而言,那既然是每一个不同的进程,那我是不是就可以通过这个Linux内核提供的技术,这种隔离进程主技术去进行资源隔离?隔离的物品资源,物理资源主要有CPU、内存L对吧?好,那2017年进入Linux2.64的内核,也就是200721,也就是Linux2.6.24的内核才支持这么一个c group,那如果是之前的老版本,是不是就就不能去用了,对吧?好,C group不是完全知道,它是将进程管理器从CPU set中剥离出来。
03:18
作者,是呢,谷,谷歌的这么一个比特,这么一个老哥是吧,他搞出来这么一个东西,好,那刚才我们讲了这么多,记住一点,C group才是我们的。在dock里做我们容器或者叫做使用资源隔离的这么一个真正的底层技术,这就够了。好下一个默认情况下,如果不对容器做任何限制,容器能够占用当前系统给予容器提供的所有资源,也就意味着什么,它是一个饕餮,你只要去有对应的资源能够给他,他全部能用掉,当然当然前提是容器里的技能再去占用的情况下,对吧?他如果不用,你给他是不是也白搭啊?能理解我意思吧,也就意味着我们现在考虑的是容器内部的进程,工作的进程,他对于资源的所需量是无止无尽的。
04:13
也就是有多少它能用的话,那这样的话,我们的整个数组机的。资源全部都会被这一个容器给占用到。好。那下一个刀客限制可以从内存、CPU和我们的磁盘IO这么三个方面去考虑,那我们呢,只会去讲这么两种,第三种没有什么特殊含义,因为在真正的生产环境中,我们的数据目录都是通过杠V选项从别的地方给挂载过来的,对吧?像这种方案限制的话是限制不了,所以默认本机的这么一个磁盘后的限制没有什么意义。那我们讲了这么多。现在你应该了解的一个点就是。如果不对容器做限制,容器内部的进程对资源所需要的。无穷无尽的话,那会造成整个操作系统的瘫痪,那难道Linux内核没有对应的机制可以防御这种错误吗?当然可以,对吧?那也就是ome这么一个linu公司内核的一个机制。
05:15
叫做内存不足。臭。那这个呢,我们把它叫做o me。这什么含义呢?这是我们的Linux内核自身的这么一个保护机制。除了我们的和我们的C在圣诺二六中的C,对吧,他们位于绝对不会关闭的这么一个对内以来,其他的所有的资源都有可能被随机删除。也就意味着,如果有一天我们Linux内核自己的内存都不够了,那外部是不是还有用户空间,里面是不是还有一些不同的一些技能在工作?那他呢,就会随机的杀死这些用户空间内的一些进程,去保证自己内核的运行。
06:05
这样说的话应该比较容易理解了,对吧,但是它的。呃,杀除机制也不是这么明目张胆,或者是这么随意的,它也会根据对应的权重关系,比如我们现在有在用户空间里有这么几个进程,他的权重最高,那他会优先杀死其他几个进程,如果还不够的话,再会杀他。希望大家能够理解。所以呢,在这种情况下,Do DEMO如果有一天内存不够了,Do DEMO本身被杀死了,那所有容器是不是都GG了,所以我们在do他自己也调整了dock DEMO的OM的。Ome的优先级避免被内核关闭,也就意味它会杀死,有可能会杀死其他不同的容器。那讲了这么多,给大家总结一下。第一个c group是我们的容器资源限制的底层技术。
07:01
第二个限制方面,可以从内存、CPU、磁盘。角度出手。第三个,如果不对容器做任何限制,容器是可以使用我们所有的。树街的资源的。那既然能够使用所有数主机的资源,就可能会造成我们数主机的资源不够。比如内核啊,内存不够用了。那这种情况下我们就会启动ome的机制,就是内核自动启动的。那为了防止O。会误删除的,把do DEMO给他删除掉,给他干掉,所以do DEMO呢,OM的优先级会比较高。不会被删除,但是我们启动了一些容器,它也是在linuxx里面,也是以我们的进程的方式存在的,对吧,他们就有可能被随机删除,有可能把MYSQL,对吧?MYSQL的容器给删了,那你的lamp环境还有什么意义呢?
08:04
所以对于内存的限制来说,是我们比较常去做的这么一件操作,好,那接下来我们继续往后看比较重点性的一些说明,对吧?啊,首先看第一个为应用做内存压力测试,理解正常业务需要使用的内存情况,然后再进入生产环境周期。这一步操作是必须的,需要大家理解。我们Linux运维呢,有很多的一些分类对吧,比如什么监控运维啊,IDC运维,硬件运维,包括我们的系统运维,业务运维,什么虚拟化运维对吧,等等,那这些运维其中还有一个叫做什么测试,测试工程师。测试工程师主要就是测试我们的一个进程,在某种情况下需要资源的这么一个大小,包括我们的呃业务。代码编写完毕以后,有没有对应的一些什么所谓的bug啊,或者一些问题存在,对吧,都是这些人去干的,这一步是比较重要的,好,第二个一定要限制容器的内存使用上限,这个是在我们的。
09:08
这是在我们的真正的生产环境中需要做的这么几件事情,对吧?第三个尽量保证主机的资源充足,监控发现资源不足,扩容或者容器进行迁移。那还是那句话,对于我们整个业务环境来说,监控服务器非常至关重要,对吧,ZBPSZ对吧,好。最后一个,如果可以,内存资源充足,尽量不要使用swap swap会导致内存计算复杂,对调度器不友好,那对调度器不友好的结果就是可能会造成一些资源分配的不均。所以在哪,所以在后面的一个我们叫做什么,以后我们会给大家录了一个叫库,叫什么资源调度器,对吧,它甚至默认情况下都不使用swap进行当做内存的分配。好,那我们接下来继续往后看。
10:01
那怎么样去做一些设置呢?在刀刻启动中,启动参数中和刀内存限制有关的参数的值一般是内存大小,也就是一个正数,后面跟上内存的单位,那BKMG。比特KBMG和GB,也就意味着这边的左边是代表右边的,它们与之相互关联,这个应该不需要我去解释了,对吧,就是一个简写,仅此而已。好,那我们看有哪些参数吧,第一个叫杠M,杠杠memory容器能够使用的最大的内存大小最小为四兆。如果你一个容器,它的内存大小都不够适兆的话,你觉得什么进程能够起得来?当然有,对吧?当然有,比如什么print,什么平F是这个意思吧,但一般来说,像这种竞争在生产环境中出现的几率不太大,对吧?好,一般来说肯定是大于十兆B的。我这里是最小值为四兆B,并不是人为限制,而是dock进程本身的限制,如果你小于十兆B,它不让你去采用,需要大家注意一下。
11:07
好,第二个memory swap容器能够使用的swap大小。但需要注意一下的就是,这里设置了memory swap使用的能力的大小并不是最终的swap的大小,它是有一个计算量的,我们看这张图给大家解释一下,首先这里会有一堆不同的情况存在。第一个选项是杠杠memory swap。第二选项是杠杠memory,第三个是功能对吧。当杠杠memory slap设置为正数S时,杠杠memory设置为正数M时。那容器可用的总空间,也就总内存大小为S。其中我们的内存,真正的物理内存可用为M。虚拟交换。内存。为S,请M。
12:02
也就意味着如果这里的值设置的会是十兆B的话,这里设置的是四兆B,那我们能够用到的物理内存的大小是四兆B,能够用到的虚拟内存大小为六兆比,这里是有个相加的关系,这里设置的并不是我们swap的大小,而是两边加在一块的大小,需要大家理解一下。好,若S等于M,则无可用的swap资源,也就意味着如果这里刚刚memory swap设置的为是,这里设置的为是,那最终的结果就是只有我们的物理内存使用,我们swap允许使用的交换就是虚拟内存或者交换空间对吧?为零需要大家注意一下。好。如果memory swap设置为零,Memory设置为正数的话,相当于没有设置swap。没有设置时候相当于是什么?相当于swap的可用大小为两倍的M。
13:01
也就意味着,如果这里是设置为零,这里设置为四,那我们加在一起能够使用的最使用的内存的大小就是12,原因是什么?它设为零相当于未设置,未设置的默认值就是。杠M的两倍,也就是八兆比,那八加四是不是12?那下一个选项是不是跟他一样的,只不过是两种不同的写法对吧,一个是不设置,一个是设置为零,都代表on c需要大家注意一下。好,那还有一个参数就是负一。杠杠memory slap负一,杠杠memory正数。这种情况相当于就是容器可以使用我们的外层主机的最大的swap分区空间,也就是比如这里设置的也有四,这里设置负一,那能够使用的物理内存的大小为四兆P。那能够使用的swap空间的大小为多大呢?为你数主机的所有。
14:02
就这么霸气对吧,它一般来说这种情况下用的非常非常之少,对吧,我们之前也给大家提到过了,基本上还是不建议在生态环境中使用我们SPA空间的。速度较慢对吧,交换起来也比较慢,耗费资源等等一些,呃,不太友好的一点,包括现在内存已经非常廉价了,对吧,没有必要好下一个,这是一个注意点。就一句话解释,在容器内部使用frame命令看到的swap空间没有真实含义,这一句话就够了,也就意味着你别到容器内部一看诶,Free-M,一看诶,八个G,诶,这是我能使用的最大的吗?并不是没有什么特殊含义,需要大家注意一下。好,那我们继续往后看。这是我们杠M和杠杠memory swap,它俩结合起来使用的时候一个非常重要的一点,对吧,好,下一个memory swap。默认情况下,主机可以把容器使用的匿名液swap出来,也就交换出来,对吧?你可以设置一个零到100的值代表允许swap交换出来的比例。
15:07
那这是什么含义呢?也就意味着在正常情况下,我们主机能够使用的这么一个内存的这么一个交换液,或叫匿名页。那这个零到100的值呢,代表了含义就是。比如举个例子对吧,我如果设置的是事实。那默认情况下,我会先把我们的整个内存中的40%的资源先给利用到,也就是允许利用40%的资源,那剩下的呢,由我们的交换分区去补充。那如果是零的话,代表什么?完全不用我们的交换分区的页。那这样的话是不是效率更高呢?对吧?所以一般来说它的设置我们一般都不会去去采用,而是用我们的内核自己去调控,那如果要设置的话,一般都会设置为十不采用,需要大家注意一下,好下一个memory reseration对吧,设置一个内存soft limited,也就是我们的啊什么应用的软件的最小值对吧。
16:10
设置为,设置值为一般小于杠M的设置不能是一般小于,而是必须小于,这个相当于是我们的内存资源的一个软限制,这相当于是一个硬限制。那什么叫软限制,什么叫硬限制呢?也就意味着,只要你加了杠M以后,这个容器顶炸天,它都不能超过你杠M设置的大小。但如果你设置了一个软限制,比如软限制是十兆B,硬限制是20兆B,它是可以允许超过十兆B的。举个例子,比如我现在我们的呃,主机的资源现在非常非常非常之多。那这时候如果容器它的利用空间超过十兆B了,它允许允许你上去当,但是绝对不能超过20兆B,当我们的内存不够用的时候。
17:01
那它就会让它压缩回十兆壁。能理解我的意思吗?可以允许临时的跃升,跃升为你的最大最大限制,软限制就是这么一个含义,但是当内存不够用的时候,会把你压回软限制。好,所以相当于给了他一定的浮动空间,对吧,好,下一个啊,Kernel memory。讲的是什么内核内存的使用大小,对吧,也就是我们的整个呃,容器里的内核使用的大小,那包括我们的一些什么所谓的套接就使用的内存啊,TCP连接使用的内存啊,对吧,这些都在我们这么一个限制范围之内。一般来说,我们不去限制下一个杠杠omq disable是否运行OM时候杀杀死我们的容器,如果只设置了杠M,才可以把这个选项设置为false false代表的含义是不是就是?这个容器不被OM所杀死。那如果你没有设置杠M的话,你还设置为false的话,也就意味着有非常有可能造成的,就是比如这个容器,它会一直一直去调用我们的系统资源,调用到最大的结果,最后的结果就是除了这个容器以外,其他容器全部死亡。原因是什么?你告诉他了,他不能被我们的OM机制给退出,但是他又无限无限的去要。
18:21
那是不只能杀,其他的一些容器,全部杀完。并不,并不止,并不止其他的容器,还有什么主机上的一些什么其他的进程都会死。能理解我的意思吗?所以这是一个非常恐怖的事情,所以一定一定一定需要注意,这个值一般我们都不设,一般都不设。因为容器是不是有治愈机制啊,对吧,哪怕他零食多了以后被杀死了以后,他是不是还能启动补充一个,那如果加了这个值以后,可很可能造成我们刚才所说的这么一种情况,如果你想设的话,那你就先设一个杠M,设置它的硬线制为多大以后再去设我们的false,需要大家注意一下。
19:03
好,那这个呢,就是我们在内存里面做限制的时候,能够见到的一些设置手段。咱们这节课呢,讲了一些关于我们的doer的它的一些内存的限制方案,对吧?我们还没有做实验,那我们先把这些选项给大家解释完了以后,我们在第三篇,也就是第三个片段,对吧?我们再去给大家去做一些常见的一些叙数实验,限制了一些参数,好,那这节课呢,我们就先讲到这里,我们下节课再见。
我来说两句