docker容器会认为自己可以使用 宿主机 的全部cpu资源,这里启动容器之后,尝试占用一个完成的cpu核心
docker run -it --name ubuntu ubuntu /bin/bash
while : ; do : ; done &
可以看到4个内核中,有一个内核 是 100us
我们知道docker –cpu-shares 参数可以控制容器可占用cpu的百分比
例如单独启动一个容器的情况下,由于没有竞争,即使 –cpu-shares=500 ,容器也可以占用全部内核
为了竞争,我们锁定 两个容器在第一个内核上,然后设置百分比
docker run -it --name test1 --cpu-shares=500 --cpuset-cpus 0 ubuntu /bin/bash
主要看右下的top上有两个bash进程,一个是 66.4 另一个是 33.2
不过 –cpu-shares 只能控制占用百分比,这也是早起docker提供的唯一可以分配cpu资源的参数
这一原理同 Kubernetes resources 中的 requests
如果要实现同 Kubernetes resources 中的 limits , 需要使用
- cpu.cfs_quota_us
- cpu.cfs_period_us
period 默认是 100ms,也就是 100000us, 下面语句的意思是 10万个单位的资源,可以使用2万,也就是20%
docker run -it --name test1 --cpu-period=100000 --cpu-quota=20000 --cpuset-cpus 0 ubuntu /bin/bash
下图中的 bash 进程已经锁定在了 19.9%