CPU资源限制

在本章文章中我给大家讲一下CPU的资源限制相关的一些参数以及背后的一些含义。

9.2.1 CPU限制说明

docker 提供的 CPU 资源限制选项可以再多核系统上限制容器能够利用那些 VCPU(虚拟CPU)。而容器最多能使用的 CPU 时间资源限制有两种方式:

  • 一、有多个 CPU 密集型的容器竞争 CPU 时, CPU 密集型:就是对 CPU 的请求非常频繁,像这类的服务我们都把他叫做 CPU 密集型服务,那如果是这种服务类型工作在我们的容器内部的话,那这个容器就成了 CPU 密集型的容器了。可以设置各个容器能够使用的 CPU 时间相对的比例,也就表示着设置一个权重的关系。

    • 假设我现在有一堆的苹果,但是现在又有三个小朋友,第一个小朋友比较能吃我给这个小朋友说你可以吃整个资源里面的4份,第二个小朋友可以吃两份,最后一个小朋友能吃一份。也就意味着我最终能把一堆苹果发成7份。这样做的好处是如果在来一个小朋友还是这一堆苹果,并且这个后来的小朋友不怎么能吃,所以我就给他一个苹果,那最终结果我们会把这一堆苹果划分为8份。这是按照 CPU 时间相对比例去做的,所以这也是比较有优点的这么一件事情。

  • 二、以绝对的方式设置容器在每个调度周期能够使用的 CPU 时间,也就是上面第一个是相对的,而第二个是绝对的

接下来我们去看一下 CPU 的设置选项有哪些

9.2.2 CPU 限制方式

参数选项:

--cpuset-cpus=""    #这里解释的是允许使用的 CPU 集,所谓的 CPU 集就是本机 CPU 的线程核数,假如是4核对应的值就是 0 1 2 3 ,0 表示第一个 CPU 、1 表示第二个 CPU 以此类推。那如果我这里给这个参数设置的这个值为 0 的话,就代表着这个启动的容器只能够使用到我们物理机的第一个 CPU,如果是 0,2 就表示能够使用我们物理机的第一个和第三个 CPU ,0-3 就表示能够使用到第一个到第4个之间的所有 CPU。这个参数就是用来设置我们启动容器能够使用的那一个或多个 CPU 。这是一个绝对值

-c,--cpu-shares=0   #CPU 共享权值(相对权重),默认值为1024。解释:如果我去开启几个容器,第一个容器加的参数是--cpu-shares=2048,第二个容器我没有加任何 CPU 限制参数,那他们最后的结果等于多少呢,如果他们两个共同去争的话,容器一我们设置的是2048、容器二由于没有设置CPU的限制使用的就是默认值1024。这时候就会将整个 CPU 的资源分成 3 份,第一个容器能够使用两份、第二个容器只能使用三份 CPU 中的一份。并且如果又起了一个容器而且设置的值为4096,那也就意味着将整个 CPU 分成了7份,这时候 CPU 就会重新进行划分,然后第一个容器会使用整个 CPU 7份中的两份,第二个容器会使用整个 CPU 7份中的一份,第三个容器会使用到整个 CPU 7份中的三份,也就意味着这是一个动态的过程,一旦有新的容器加入以后 CPU 就会重新进行权重的计算

--cpuset-mems=""    #允许在我们的节点上执行我们的内存节点,这个参数就会牵扯到另一个系统架构 NUMA。我们去设置执行的内存节点的时候,比如我设置的节点是 1,2 表示为第二个内存节点和第三个内存节点,那为什么我们做 CPU 限定会和内存去比对呢?原因是它会优先与 1 内存节点相邻的两个 2 内存节点相邻的两个 CPU 去使用调度,这样会优于我们的 CPU 和 CPU 存储之间的过程。
NUMA:非统一内存访问的这么一种系统架构,是一种用于多处理器的电脑记忆体设计,也就是多内存的时候会利用到的这么一个架构方案,内存访问时间取决于处理器的内存位置(处理器内部也有内存)。在 NUMA 下,处理器能够访问它自己本地存储速度,比非本地存储快。我们可以理解为,一级缓存二级缓存三级缓存、但是一级缓存二级缓存三级缓存他们都不是一个完整的片,而是在不同的单 U 下会对应绑定,比如我现在有 4核 CPU我们的一级和二级缓存可能会这样去设计,每核 CPU 下面都会一个最近的这么一个缓存片段。

--cpu-period=0      #即可设置调度周期,CFS 周期有效范围是 1ms~1s,所以对应的 --cpu-period 能够使用的范围 1000~1000000(微秒) 之间
    
--cpu-quota=0       #设置调度每个周期内容器能够使用的 CPU 时间,容器的 CPU 配额必须不小于 1ms ,即 --cpu-quota的值必须 >= 1000微秒。

一般来是 --cpu-period--cpu-quota 这两个值会一起使用,但需要注意一点就是我们整个的在 Linux 操作系统下叫做公平调度策略,也就是意味着会尽可能的保障每个进程能够使用的 CPU 资源是相对平衡的,但我这里也说了是相对的。

--cpus              #能够限制容器使用的主机 CPU 个数,并且这里需要大家注意一下还可以使用我们的1.5个 CPU也就是第一个 CPU 使用我们的百分之百,第二个 CPU 使用我们的百分之50,如果是超过两核的 CPU 主机例如4核 CPU的话,他只要拼成 1.5个就够了,可以是第一个 CPU 百分之50 第二个 CPU 百分之50 第三个 CPU 百分之50直到满了1.5个即可。怎么去拼和我们 CPU 的调度方式有关。

9.2.2.1 –cpu-period和–cpu-quota 参数的使用(比较重要)

我通过简单例子来讲解这两个参数的使用,因为这两个参数比较重要。

第一个使用范例:

docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:16.04 /bin/bash

--cpu-period=50000#一个 CPU 的调度周期
--cpu-quota=25000#一个 CPU 的调度周期中能够使用的CPU 时间为25000也就是50000的一半

#这条命令的含义:设置我们ubuntu:16.04 容器的 CPU 一个调度周期为50000 微妙。一个调度周期内部使用的 CPU 时间为25000 ,也就意味着我能使用的是 CPU 百分之50的分片时间

第二个使用范例:

docker run -it --cpu-period=10000 --cpu-quota=20000 ubuntu:16.04 /bin/bash

--cpu-period=10000#一个 CPU 的调度周期为10000
--cpu-quota=20000#一个 CPU 的调度周期中能够使用的 CPU 时间为20000,也就是 CPU 调度周期的两倍,所以就是能够使用两个 CPU。

#这条命令的含义: 一个 CPU 的调度周期确实只有10000 ,但是 --cpu-quota为20000,所以就要调用两个 CPU ,也就意味着在一个分片时间内,我能利用满百分之百两个 CPU
点赞