Docker容器CPU分配

5
我已经创建了一个容器:
docker run -c=20 -i -t  ubuntu:latest /bin/bash

我尝试使用-c标志来控制CPU使用率,并将其最大化为50%。当我在容器内运行md5sum /dev/urandom时,在主机上使用了100%的CPU。

3个回答

7
-c标志用于docker run命令,相对于所有其他正在运行的容器的权重,修改容器的CPU共享加权。
它不会限制容器从主机机器使用CPU。
您可以使用--cpu-quota标志来限制CPU使用率,例如:
$ docker run -ti  --cpu-quota=50000 ubuntu:latest /bin/bash

--cpu-quota通常与--cpu-period一起使用。更多详细信息请参见Docker运行引用文档:

https://docs.docker.com/reference/run/#runtime-constraints-on-resources


1
无法使用此标志启动容器: 守护进程的错误响应: 无法启动容器34d7af589688931383975f666b5852e14ea03c5db05ec7a6ae7347171fe34fbf:[8]系统错误:写入/sys/fs/cgroup/cpu,cpuacct/system.slice/docker-34d7af589688931383975f666b5852e14ea03c5db05ec7a6ae7347171fe34fbf.scope/cpu.cfs_quota_us时出现无效参数 - user4725754
自Docker 1.7版本以来已经可用(https://github.com/docker/docker/blob/master/CHANGELOG.md) - Alex da Silva
是的,我正在使用1.8.3版本。 - user4725754
我刚刚编辑了我的答案,并添加了一个运行命令的示例。我在本地的Docker中运行它,它可以正常工作(我使用的是Docker 1.8.3)。 - Alex da Silva
谢谢!但是我对它的方法有疑问。0 表示100%,而 50000 表示50%的使用率?为什么? - user4725754
2
这里有更多的细节 - https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt。我不确定为什么docker选择0作为100%的默认值,从技术上讲,根据上面的链接,应该是-1。无论如何,由于默认周期为100000,因此50000即为50%的CPU使用率。我发送的链接更好地解释了配额和周期之间的关系。基本上,在一个周期(也是以微秒为单位)内限制配额(以微秒为单位)。希望这可以帮助到您。 - Alex da Silva

6

看起来你正在运行单个容器,所以这是预期结果。

你可能会发现这篇博客文章很有帮助。

每个新容器默认具有1024个CPU共享。这个值本身没有任何意义。但如果我们启动两个容器并且两个容器都使用100%的CPU,那么CPU时间将平均分配给两个容器,因为它们都具有相同的CPU共享(为了简单起见,我假设没有其他进程在运行)。


1

看这里,显然这就是你在寻找的内容:

https://docs.docker.com/engine/reference/run/#cpu-period-constraint

默认的CPU CFS(完全公平调度器)周期为100毫秒。我们可以使用--cpu-period设置CPU周期,以限制容器的CPU使用率。通常情况下,--cpu-period应该与--cpu-quota一起使用。
示例:
$ docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:14.04 /bin/bash

如果有1个CPU,这意味着容器可以每50毫秒获得50%的CPU运行时间。
周期和配额定义:
在每个给定的“周期”(微秒)内,一组只允许消耗最多“配额”微秒的CPU时间。当一组的CPU带宽消耗超过此限制(对于该周期),属于其层次结构的任务将被限制,并且不允许再次运行,直到下一个周期。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接