【知识梳理】Docker容器如何限定CPU

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。
前言
Docker 通过 Linux 的cgroup(Control Groups)来实现容器的资源配额和限制。cgroup是 Linux 内核提供的一种机制,可以对一组进程或线程进行资源限制、优先级控制、账户分配等操作。通过cgroup,可以对 CPU、内存、磁盘、网络带宽等资源进行限制和管理。
默认情况下,每个容器对主机CPU的使用是无限制的。 例如一台主机上如果只有一个docker容器,那么它可能会使用所有的CPU。如果有多个容器在运行,可以设置一些约束条件,限制容器在CPU资源紧张时可使用的CPU时间。
限制容器的CPU份额
cpu_share是 Linux cgroup的一个功能,它是一个相对值,控制容器中进程能使用多少 CPU 时间,
将 CPU 资源按比例分配给不同的容器,以确保在共享主机的情况下,每个容器都可以获得足够的 CPU 资源。
在启动容器时,将容器参数--cpu.shares设置为大于或小于其默认值 1024,用以增加或减少容器的权重,并赋予其对主机 CPU 周期中更大或更少比例的访问权限。不过当CPU周期充足时,所有容器都会使用所需的CPU;只有在CPU周期受限时才会强制执行。从这个角度看,这是一个软性限制。 但这并不能阻止容器被调度为群组模式。它会优先分配容器CPU资源以分配可用的CPU周期。它并不保证或保留任何特定的CPU访问权限。
例1:一台只有1个CPU的主机上运行2个容器,容器①的 cpu.shares 参数设置为 1024,而将容器②的 cpu.shares 参数设置为 512,则按照两个值的比例看,第一个容器将获得⅔CPU;第二个容器将获得⅓CPU:

例2:一台只有1个CPU的主机上运行3个容器,容器①的 cpu.shares 参数设置为 1024,容器②和容器③的 cpu.shares 参数设置为 512,则按照3个值的比例看,容器①将获得0.5CPU;容器② ③将分别获得0.25CPU:

例3:如果例2中的3个容器运行在一台有2个CPU的主机上,则按照3个值的比例看,容器①将获得1 CPU;容器② ③将分别获得0.5CPU:

在启动 Docker 容器后,可在/sys/fs/cgroup/cpu/cpu.shares文件中查看--cpu-shares 参数设置的 CPU 资源份额:

限制可用的CPU个数
在工作中,限制CPU个数更为常见,使用 --cpus 参数即可。
--cpus可以指定容器可使用多少可用CPU资源。例如,如果主机有3个CPU,而在容器中设置--cpus="1",容器最多保证有一个CPU。这相当于设置--cpu-period="100000"和--cpu-quota="100000":
# docker run -it --rm --name nginx1 --cpus=1 nginx /bin/bash
# stress -c 4 #在容器内执行压测命令

另开一个窗口执行docker stats命令可看到CPU已打满:

再开一个窗口查看CPU使用状况,可以看到3个CPU的使用率是大致平均的,并非这一个容器只跑在一个CPU上:

指定容器运行的CPU范围
假如主机有多个CPU,而只想让容器在其中1个或几个CPU上,则可以使用参数--cpuset-cpus设置。
在主机有多个CPU的前提下,--cpuset-cpus可以限制容器能使用的CPU或核心,使用逗号分隔或连字符指定CPU范围,第一个CPU编号为0。
设置"--cpuset-cpus 0-1"含义:使用第1、2个CPU;
设置"--cpuset-cpus 1,3"含义:使用第2个、第4个CPU;
例:
# docker run -it --name nginx1 --cpuset-cpus="0-1" nginx /bin/bash
# stress -c 6 #在容器内执行压测命令

另开一个窗口执行docker stats命令可看到CPU已打满:

再开一个窗口查看CPU使用情况,可以看到CPU的压力都在第1个第2个CPU上,第3个CPU几乎闲置:

如果把命令换成:
# docker run -it --name nginx1 --cpuset-cpus="0,2" nginx /bin/bash
使用相同压测方法可以看到压力在第1和第3个CPU上,第2个CPU几乎闲置了:

以上则是容器限制CPU使用的三种场景和方法。
参考文档:
https://docs.docker.com/engine/containers/resource_constraints/
https://batey.info/cgroup-cpu-shares-for-docker.html
欢迎关注SRE成长记一起探讨学习!↓↓↓
更多推荐


所有评论(0)