作者:【吴业亮】

博客:https://wuyeliang.blog.csdn.net/

在 docker 1.13 及更高的版本上,能够很容易的限制容器可以使用的主机 CPU 个数。只需要通过 --cpus 选项指定容器可以使用的 CPU 个数就可以了,并且还可以指定如 1.5 之类的小数。

通过下面的命令创建容器,–cpus=2 表示容器最多可以使用主机上两个 CPU:

[root@docker ~]# docker run -it --rm --cpus=0.5 centos /bin/bash
[root@e52df4803248 /]# while  true  ; do echo 1 > /dev/null; done

执行top查看宿主机

top - 16:31:43 up  1:54,  3 users,  load average: 0.20, 0.65, 0.59
Tasks: 142 total,   2 running, 140 sleeping,   0 stopped,   0 zombie
%Cpu(s):  4.3 us,  7.7 sy,  0.0 ni, 87.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.1 st
KiB Mem :  8009424 total,  7126416 free,   253968 used,   629040 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  7459584 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                               
 9473 root      20   0   11820   1688   1412 R  49.8  0.0   0:18.18 bash

对于更早的版本完成同样的功能我们需要配合使用两个选项:–cpu-period 和 --cpu-quota(1.13 及之后的版本仍然支持这两个选项)。下面的命令实现相同的结果:

# docker run -it --rm --cpu-period=100000 --cpu-quota=50000 centos /bin/bash

–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资源。

它们的单位是微秒,100000 表示 100 毫秒,200000 表示 200 毫秒。它们在这里的含义是:在每 100 毫秒的时间里,运行进程使用的 CPU 时间最多为 200 毫秒(需要两个 CPU 各执行 100 毫秒)。

通过 --cpus 选项我们无法让容器始终在一个或某几个 CPU 上运行,但是通过 --cpuset-cpus 选项却可以做到!这是非常有意义的,因为现在的多核系统中每个核心都有自己的缓存,如果频繁的调度进程在不同的核心上执行势必会带来缓存失效等开销。下面的命令为容器设置了 --cpuset-cpus 选项,指定运行容器的 CPU 编号为 1:

# docker run -it --rm --cpuset-cpus="1" centos/bin/bash

设置使用 CPU 的权重
当 CPU 资源充足时,设置 CPU 的权重是没有意义的。只有在容器争用 CPU 资源的情况下, CPU 的权重才能让不同的容器分到不同的 CPU 用量。–cpu-shares 选项用来设置 CPU 权重,它的默认值为 1024。我们可以把它设置为 2 表示很低的权重,但是设置为 0 表示使用默认值 1024。
下面我们分别运行两个容器,指定它们都使用 Cpu0,并分别设置 --cpu-shares 为 512 和 1024:

# docker run -it --rm --cpuset-cpus="0" --cpu-shares=512 centos /bin/bash
# docker run -it --rm --cpuset-cpus="0" --cpu-shares=1024 centos /bin/bash

两个容器分享一个 CPU,所以总量应该是 100%。具体每个容器分得的负载则取决于 --cpu-shares 选项的设置!我们的设置分别是 512 和 1024,则它们分得的比例为 1:2。在本例中如果想让两个容器各占 50%,只要把 --cpu-shares 选项设为相同的值就可以了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐