困惑于Docker上的cpushare设置。

我用python编写了一个testing程序“cputest.py”,如下所示:

import time while True: for _ in range(10120*40): pass time.sleep(0.008) 

,当在一个容器中运行时,其成本为80% (不受其他运行容器的干扰)。

然后我用以下两个命令在两个容器中运行这个程序:

 docker run -d -c 256 --cpuset=1 IMAGENAME python /cputest.py docker run -d -c 1024 --cpuset=1 IMAGENAME python /cputest.py 

并用“顶”来查看他们的CPU成本。 原来,他们相对花费30%67%的 CPU。 这个结果让我很困惑。 有人会为我解释吗? 非常感谢!

我昨天坐下来试图自己弄清楚,但最终无法解释70/30分裂。 所以,我发了一封电子邮件给其他一些开发者,并得到了这个回应,我认为这是有道理的:

我认为你有点误解任务调度的工作原理 – 这就是为什么math不起作用。 我会尝试挖掘一篇好文章,但是在基本层面上,内核会为每个需要执行的任务分配时间片,并将片分配给具有给定优先级的任务。

所以对于这些优先级和紧凑的循环代码(没有睡眠),内核分配4/5的插槽给a和1/5到b。 因此80/20分裂。

但是,当你join睡眠时,它变得更加复杂。 睡眠基本上告诉内核产生当前任务,然后在睡眠时间结束后执行将返回到该任务。 它可能比给定的时间更长 – 特别是如果有更高优先级的任务运行。 当没有别的东西在运行内核的时候,它只是坐在空闲的睡眠时间。

但是当你有两个任务时,睡眠允许两个任务交织在一起。 所以当一个人睡觉的时候另一个人可以执行。 这可能会导致一个复杂的执行,你不能用简单的math模型。 随意在那里certificate我错了!

我认为70/30分裂的另一个原因是你做“80%负荷”的方式。 您为环路和睡眠select的数字恰好在PC上正常工作,执行单个任务。 您可以尝试移动循环以基于经过的时间 – 循环0.8然后睡0.2。 这可能会给你更接近80/20的东西,但我不知道。

所以实质上,你的time.sleep()调用会偏离预期的数字,删除time.sleep()导致CPU负载距离你所期望的更近。