多容器任务运行时,很难计算CPU的使用率
命令中的–cpu-shares选项值不能保证可以获得1个vcpu或者多少GHz的CPU资源,仅仅只是一个弹性的加权值。
[root@10 ~]# docker run --name=con1 -itd --cpu-shares 1024 centos:stress /bin/bash
f66fe17649f5b08401348fea37f4b1b4454dc581341f451697172d09716cbc6a
[root@10 ~]# docker run --name=con2 -itd --cpu-shares 1024 centos:stress /bin/bash
a2150bc7a7f2e2491abb1679ffad744badb07652bd38803824e2ded8410e5ba2
[root@10 ~]# docker run --name=con3 -itd --cpu-shares 2048 centos:stress /bin/bash
ae249a8f18d01d0fa61e638e26c86271c961b7c203b10eb6f3dee45be571d0e3
如果有一个容器D需要更多CPU资源,则可以将其–cpu-shares的值设置为4096,那么ABCD的CPU资源比例变为1:1:2:4。
默认情况下,每个docker容器的CPU份额都是1024。单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的CPU加权的效果才能体现出来。
例如,两个容器A、B的CPU份额分别为1000和500,在CPU进行时间片分配的时候,容器A比容器B多一倍的机会获得CPU的时间片。
但分配的结果取决于当时主机和其他容器的运行状态,实际上也无法保证容器A一定能获得CPU时间片。
比如容器A的进程一直是空闲的那么容器B是可以获取比容器A更多的CPU时间片的。
极端情况下,比如说主机只运行了一个容器,即使它的CPU份额只有50,它也可以独占整个主机的CPU资源
Cgroups只在容器分配ID额资源紧缺时,也就是说在需要对容器使用的资源进行限制时才会生效。
因此无法单纯根据某个容器的CPU份额来确定有多少CPU资源分配给它,资源分配结果取决于同时运行的其他cpu shares可以设置容器使用CPU的优先级
启动了两个容器及运行查看CPU使用百分比。
[root@10 ~]# docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10
[root@10 ~]# docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
[root@10 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09730b873e46 centos:stress "stress -c 10" 6 minutes ago Up 6 minutes cpu1024
3ab12e09a79f centos:stress "stress -c 10" 6 minutes ago Up 6 minutes cpu512
docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10
docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
docker exec -it cpu512 /bin/bash
docker exec -it cpu1024 /bin/bash
开启了10个stress进程,目的是充分让系统资源变得紧张。只有这样竞争资源,设定的资源比例才可以显现出来。
如果只运行一个进程,会自动分配到空闲的CPU,这样比例就无法看出来。由于案例的环境不一样,
可能导致三个面两张图中占用CPU百分比会不同,但是从cpu share来看两个容器总比例一定会是1:2。