如果某些容器运行的进程比其他容器多,则 CPU 资源有时不会按比例分配给 Docker 的 cpu-shares
。
我想将 CPU 资源平均分配给两个 docker 容器。为此,我将相同的 cpu-shares
值传递给两个容器。以下命令运行 CPU 压力工具以尽可能多地使用 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。
错误行为并不总是发生,因此读者可能无法立即重现。我已经在不同的机器上测试了上述示例(请参阅页面下方有关机器的信息)。结果如下:
机器 | “错误”行为的概率* |
---|---|
A | 95% |
B | 30% |
C | 5% |
* 如果容器 multi-stress
在整个实验期间接收的 CPU 超过 60%,则行为被视为“错误”。
机器描述:
# 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
# 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
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