CPU 资源未按比例分配给 Docker `cpu-shares`

时间:2021-06-01 13:38:05

标签: linux docker cgroups

总结

如果某些容器运行的进程比其他容器多,则 CPU 资源有时不会按比例分配给 Docker 的 cpu-shares

(可重现的)示例

我想将 CPU 资源平均分配给两个 docker 容器。为此,我将相同的 cpu-shares 值传递给两个容器。以下命令运行 C​​PU 压力工具以尽可能多地使用 CPU。容器 single-stress 仅运行 1 个压力客户端,而 multi-stress 仅运行 8 个压力客户端。

docker run -d --rm -it --name="single-stress" --cpu-shares=512 --cpuset-cpus="0" progrium/stress --cpu 1 --timeout 30s
docker run -d --rm -it --name="multi-stress" --cpu-shares=512 --cpuset-cpus="0" progrium/stress --cpu 8 --timeout 30s
docker stats

我预计两个容器的 CPU 利用率约为 50%。然而,docker stats 的结果表明情况并非如此。

CONTAINER ID   NAME            CPU %  
ed8e2794d415   multi-stress    62.52%
27ac7a1fc8c9   single-stress   38.07%

运行更多压力客户端的容器在整个实验期间获得超过 60% 的 CPU。

  • 这种行为是否符合预期?根据 Linux 的 cgroup 和 CFS 调度程序,运行更多进程的容器是否更有可能获得更多 CPU 资源?
  • 有什么办法可以防止这种行为?

这种错误行为多久发生一次?

错误行为并不总是发生,因此读者可能无法立即重现。我已经在不同的机器上测试了上述示例(请参阅页面下方有关机器的信息)。结果如下:

<头>
机器 “错误”行为的概率*
A 95%
B 30%
C 5%

* 如果容器 multi-stress 在整个实验期间接收的 CPU 超过 60%,则行为被视为“错误”。

机器描述:

  • 机器A:
    • 本地电脑
    • # docker info
      Cgroup Driver: systemd
      Cgroup Version: 1
      Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc runsc
      Default Runtime: runc
      Security Options:
      Kernel Version: 5.8.0-53-generic
      Operating System: Ubuntu 20.04.2 LTS
      
  • 机器B:
    • Google 云虚拟机
    • # docker info
      Cgroup Driver: cgroupfs
      Cgroup Version: 1
      Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
      Default Runtime: runc
      Kernel Version: 5.8.0-050800-generic  # Similar results with kernel 5.4.0-1043-gcp
      Operating System: Ubuntu 20.04.2 LTS
      
  • 机器C:
    • 本地笔记本电脑
    • Cgroup Driver: systemd
      Cgroup Version: 1
      Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
      Default Runtime: runc
      Kernel Version: 5.4.0-73-generic
      Operating System: Ubuntu 20.04.2 LTS
      

0 个答案:

没有答案