简述

在生产环境里运行服务的一个中心问题是资源分配,多个容器共享宿主机的资源,但是实际上这些容器也并不都是同等重要的,我们希望给重要的容器分配更多的cpu资源,防止失控的容器抢占资源,导致重要的服务难以获取资源支持。

准备工作

如果没有安装htop命令,需要先安装htop命令。

yum install htop

用于查看运行状态

docker 主进程和子进程 多进程 docker开启多线程_linux

限制容器可以运行的内核

问题

默认情况下,Docker可以在主机的任意内核种运行。只有一个进程和线程的容器明显最多只能耗尽一个内核,但是容器种的多线程程序可以使用cpu上所有的核。如果一个容器比其它容器都重要,那么它应当得到更多的cpu支持。
如何让容器最小cpu分配,对cpu消耗进行强制的限制。

解决方案:

使用–cpuset-cpus选线为容器保留cpu内核。
测试:
运行ubuntu之后,查看到cpu的两颗内核运行都比较慢,且出现卡顿。

docker run ubuntu:20.04 sh -c 'cat /dev/zero > /dev.null'

在另一个终端查看,此时使用htop查看内核使用率都显示红色,并且都比较高,且出现了明显卡顿。

docker 主进程和子进程 多进程 docker开启多线程_springboot_02


我们使用–cpuset-cpus选项

docker run --cpuset-cpus=0 ubuntu:20.04 sh -c 'cat /dev/zero > /dev.null'

在另一个终端查看,htop命令,我们发现核心1的使用率明显更高。

docker 主进程和子进程 多进程 docker开启多线程_ubuntu_03


–cpuset-cpus选项允许通过逗号分裂列表(0,1,2),范围(0-2)或者两者结合的方式(0-1,3)来指定多个内核。因此为宿主机保留cpu就是给容器选范围的时候排除一个内核的事。

讨论

通过不断分配剩余cpu给运行中的容器的方式,来为宿主机进程保留特定的cpu;也可以限制特定的容器运行各自的cpu上,从而防止它们干扰其它容器的计算。

给重要的容器更多的cpu

问题

宿主机上运行的容器一般在竞争的时候是平分cpu使用。但是有些时候,不需要它们均分cpu,而是希望它们按照比例来获取cpu资源。

解决方案

使用命令-c/–cpushares 参数,定义cpu相对使用份额。
当一个容器启动的时候,它会得到cpu的份额的数值(默认是1024)。当只有一个进程在的时候,如果有必要它对cpu有100%的使用权,不管它有多少cpu份额。
但是如果我们有ABC三个容器同时使用所有可使用的cpu资源:

  • 如果它们拿到的份额相同,则每个容器获取的三分之一的cpu
  • 如果A和B 分别拿到256,而C获取的512,那么A和B各自获取1/4的cpu资源,而C可以获取的1/2的cpu资源
    以上所有的容器可以使用机器上的所有内核(或者一个内核)。Docker会尽量将容器负载到所有的内核。如果两个容器在一个双核主机上运行单线程的任务,那么无论权重分配多少,每个容器都会分配到其在运行的内核,不管其权重多少。
    指令:
#-c 分配cpu份额
docker run --cpuset-cpus=0 -c 1000 ubuntu:20.04 sh -c 'cat /dev/zero > /dev.null' #获取的cpu比例是1000/(10+1000)
docker run --cpuset-cpus=0 -c 10 ubuntu:20.04 sh -c 'cat /dev/zero > /dev.null' #获取的cpu比例是10/(10+1000)

讨论

通常业务我们不常用这种策略来控制资源分配。但是当有需要时,我们可以利用此策略来控制资源的分配。