Docker容器对CPU资源隔离的几种方式

了解Docker的同窗应该知道,Docker的一个很大的特性就是能够对各类资源作隔离以及限制,这些资源包括CPU、内存、网络、硬盘,关于内存、网络、硬盘的资源限制都比较好理解,无非就是分多少用多少,好比给这个容器分1G内存,那就最多能用1G的内存,可是对于CPU的限制就不是那么好理解了,并且配置起来相对来讲也更复杂一些。html

首先要知道的是Docker的资源隔离是基于Cgroups的,前面的文章里提到的coolshell的科普文章《Docker基础技术:Linux CGroup》里有作一些基本的介绍和使用方法,想要深刻了解的话能够看下redhat上的文档,由于今天主要是说对CPU资源的隔离,因此能够深刻看下关于CPU的这一章docker

Docker的官方文档里能够看到,在经过Docker run这条命令启动一个容器时能够经过--cpu-shares --cpu-period以及--cpu-quota这三个参数来控制容器对CPU的使用,可是并无作太详细的介绍以及示例,因此理解起来稍微有些困难。好比--cpu-shares和其余两个参数一块儿用会有什么效果?shell

咱们一个个来看,先看--cpu-shares,默认状况下全部容器的share(简单理解成是权重吧)是相同的,也就是全部容器有相同的权重,在全部容器一块儿竞争资源时,最终获得的资源是相同的。这个share是一个相对的值,那么这个值的意义就不能单纯的经过一个容器的share值来看,而是多个在一块儿对比,好比A和B两个容器,A配置的是1024,B配置的是512,那么A最大可使用的CPU资源是B的两倍。还有一点要注意的是这种配置是有弹性的,若是A容器一直闲着,那B容器是可使用空闲资源的。segmentfault

再来看--cpu-period和--cpu-quota,为啥把这两个参数放一块儿呢?由于这两个参数是相互配合的,在redhat的那篇文档里讲的很清楚,--cpu-period和--cpu-quota的这种配置叫Ceiling Enforcement Tunable Parameters,--cpu-shares的这种配置叫Relative Shares Tunable Parameters。--cpu-period是用来指定容器对CPU的使用要在多长时间内作一次从新分配,而--cpu-quota是用来指定在这个周期内,最多能够有多少时间用来跑这个容器。跟--cpu-shares不一样的是这种配置是指定一个绝对值,并且没有弹性在里面,容器对CPU资源的使用绝对不会超过配置的值。网络

好比说A容器配置的--cpu-period=100000 --cpu-quota=50000,那么A容器就能够最多使用50%个CPU资源,若是配置的--cpu-quota=200000,那就可使用200%个CPU资源。ide

若是这两种配置方式一块儿使用呢?我简单测试了下,应该是取两个配置的交集,目前还没作具体的测试,等作了具体的测试再把相关的数据在这里记录一下,不过配置这么复杂也没太大必要。测试

那么有什么样的应用场景呢?简单举个例子,加入对外提供A和B两个服务,可是A的优先级比B要高,假如只用--cpu-shares来配置,从实际经验来看,B服务占用资源过高时是会对A有必定的影响的,可是具体缘由我还没去深刻了解,可是若是经过--cpu-period和--cpu-quota来配置,就能起到绝对的控制,作到不管B怎么样,都不会影响到A。ui

对了,我这里特地没提到CFS这个概念,由于有点复杂,一上来就说这个东西会让人有点懵,可是理解了上面的那些东西后再看CFS就能够加深对上面那些概念的理解。CFS是Linux内核2.6.23版本开始采用的进程调度器,能够翻译为彻底公平调度器,它的基本原理是这样的:设定一个周期,目标是让每一个进程在这个周期内至少有机会运行一次,而后根据进程的数量,你们平分这个调度周期内的CPU使用权,若是有配置进程的优先级,在分割调度周期的时候要加权。翻译

相关文章
相关标签/搜索