对Docker的cpushare设置感到困惑。

时间:2014-10-09 15:17:03

标签: resources cpu docker allocation

我在python中写了一个测试程序'cputest.py',如下所示:

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

,在容器中运行时花费 80% cpu(不受其他runnng容器干扰)。

然后我通过以下两个命令在两个容器中运行该程序:

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

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

并使用'top'查看其cpu成本。事实证明,他们相对成本 30% 67% cpu。我很困惑这个结果。有人会帮我解释一下吗?非常感谢!

1 个答案:

答案 0 :(得分:4)

我昨晚坐下来试图自己解决这个问题,但结果却无法解释70/30分裂。所以,我发了一封电子邮件给其他开发者并得到了这个回复,我认为这是有道理的:

  

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

     

因此,对于那些优先级和紧密的循环代码(无睡眠),内核将4/5的插槽分配给a和1/5到b。因此80/20分裂。

     

然而,当你加入睡眠时,它变得更加复杂。 Sleep基本上告诉内核产生当前任务,然后执行将在睡眠时间结束后返回到该任务。它可能比给定的时间更长 - 特别是如果有更高优先级的任务在运行。当没有其他任何东西在运行时,内核就会闲置休眠时间。

     

但是当你有两个任务时,睡眠允许两个任务交织。所以当一个人睡觉时,另一个人可以执行。这可能会导致执行复杂,您无法使用简单的数学建模。随意在那里证明我错了!

     

我认为70/30分裂的另一个原因是你做“80%负荷”的方式。您为循环和睡眠选择的数字恰好在您的PC上运行,只执行一个任务。您可以尝试将循环移动到基于已用时间 - 因此循环为0.8然后睡眠为0.2。这可能会让你接近80/20,但我不知道。

所以从本质上讲,你的time.sleep()调用会扭曲你的预期数字,删除time.sleep()会导致CPU负载更接近你的预期。