docker在默认情况下,容器使用的资源是不受限制的。也就是可以使用主机内核调度器所允许的最大资源。如果不对容器可以使用的 cpu 资源进行限制,一旦发生容器内程序异常使用 cpu 的情况,很可能把整个主机的 cpu 资源耗尽,从而导致更大的灾难。
本文将介绍如何设置容器可以使用的 cpu 资源。
docker 的资源限制和隔离完全基于 linux cgroups。对 cpu 资源的限制方式也和 cgroups 相同。docker 提供的 cpu 资源限制选项可以在多核系统上限制容器能利用哪些 vcpu。而对容器最多能使用的 cpu 时间有两种限制方式:一是有多个 cpu 密集型的容器竞争 cpu 时,设置各个容器能使用的 cpu 时间相对比例。二是以绝对的方式设置容器在每个调度周期内最多能使用的 cpu 时间。
docker run命令和 cpu 限制相关的所有选项如下:
–cpuset-cpus= 允许使用的 cpu 集,值可以为 0-3,0,1
-c,–cpu-shares=0 cpu 共享权值(相对权重)
cpu-period=0 限制 cpu cfs 的周期,范围从 100ms~1s,即[1000, 1000000]
–cpu-quota=0 限制 cpu cfs 配额,必须不小于1ms,即 >= 1000
–cpuset-mems= 允许在上执行的内存节点(mems),只对 numa 系统有效
其中–cpuset-cpus用于设置容器可以使用的 vcpu 核。-c,–cpu-shares用于设置多个容器竞争 cpu 时,各个容器相对能分配到的 cpu 时间比例。
docker提供了cpu-period、cpu-quota两个参数控制容器可以分配到的cpu时钟周期。cpu-period是用来指定容器对cpu的使用要在多长时间内做一次重新分配,而cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。跟cpu-shares不同的是这种配置是指定一个绝对值,而且没有弹性在里面,容器对cpu资源的使用绝对不会超过配置的值。
cpu-period和cpu-quota的单位为微秒(μs)。cpu-period的最小值为1000微秒,最大值为1秒(10^6 μs),默认值为0.1秒(100000 μs)。cpu-quota的值默认为-1,表示不做控制。
例如设置容器可以在哪些 cpu 核上运行:
docker run -it –cpuset-cpus=0,6 –name centos centos /bin/bash
设置容器中的进程可以在 cpu 0 和 cpu 6上执行。