cpu 资源是不受限制的。和内存资源的使用一样,如果不对容器可以使用的 cpu 资源进行限制,一旦发生容器内程序异常使用 cpu 的情况,很可能把整个主机的 cpu 资源耗尽,从而导致更大的灾难。本文将介绍如何限制容器可以使用的 cpu 资源。》一文中创建的 docker 镜像 u-stress 进行压力测试,文中就不再过多的解释了。
Specify how much of the available CPU resources a container can use.cpus 选项支持设为小数也从侧面说明了对 cpu 的计量只能是百分比。cpu 个数" 都是不准确的。既然不准确,为什么还要用?当然是为了容易理解。况且笔者认为在 --cpus 选项的上下文中理解为 "cpu 个数" 并没有问题(有兴趣的同学可以读读 ,人家的初衷也是要表示 CPU 个数的)。
。我们要知道这两个选项才是事实的真相,但是真相往往很残忍!还好 --cpus 选项成功的解救了我们,其实它就是包装了 --cpu-period 和 --cpu-quota。
cpu
cpus 选项我们无法让容器始终在一个或某几个 cpu 上运行,但是通过 --cpuset-cpus 选项却可以做到!这是非常有意义的,因为现在的多核系统中每个核心都有自己的缓存,如果频繁的调度进程在不同的核心上执行势必会带来缓存失效等开销。下面我们就演示如何设置容器使用固定的 cpu,下面的命令为容器设置了 --cpuset-cpus 选项,指定运行容器的 cpu 编号为 1:
cpu 的负载情况:
cpu1 达到了 100%,其它的 cpu 并未被容器使用。我们还可以反复的执行 stress -c 4 命令,但是始终都是 cpu1 在干活。cpu 负载,:
cpu,运行 stress -c 4 命令,然后检查主机的 cpu 负载:
cpu1 和 cpu3 的负载都达到了 100%。cpu 负载也达到了 200%:
cpuset-cpus 选项的一个缺点是必须指定 cpu 在操作系统中的编号,这对于动态调度的环境(无法预测容器会在哪些主机上运行,只能通过程序动态的检测系统中的 cpu 编号,并生成 docker run 命令)会带来一些不便。
cpu 的权重
cpu 资源充足时,设置 cpu 的权重是没有意义的。只有在容器争用 cpu 资源的情况下, cpu 的权重才能让不同的容器分到不同的 cpu 用量。--cpu-shares 选项用来设置 cpu 权重,它的默认值为 1024。我们可以把它设置为 2 表示很低的权重,但是设置为 0 表示使用默认值 1024。cpu0,并分别设置 --cpu-shares 为 512 和 1024:
cpu0 的负载为 100%:
cpu 的负载为:
分享一个 cpu,所以总量应该是 100%。具体每个容器分得的负载则取决于 --cpu-shares 选项的设置!我们的设置分别是 512 和 1024,则它们分得的比例为 1:2。在本例中如果想让两个容器各占 50%,只要把 cpu-shares 选项设为相同的值就可以了。
cpu 的选项要简洁很多。但是简洁绝对不是简单,大多数把复杂东西整简单的过程都会丢失细节或是模糊一些概念,比如从 --cpu-period 和 --cpu-quota 选项到 --cpus 选项的进化。对于使用者来说这当然是好事,可以减缓我们的学习曲线,快速入手。