Kubernetes / Docker中的分布式CPU密集型进程

时间:2017-03-10 14:01:25

标签: docker kubernetes cpu-usage

我有一个使用大量CPU的应用程序。我认为在Kubernetes中将工作量分配给小部分工作,然后我创建了几个CPU限制的pod。事实证明,Docker有一个约束,它在所有运行CPU密集型进程的容器(https://docs.docker.com/engine/reference/run/#cpu-share-constraint)之间分配CPU总量。出于这个原因,每个pod都不能使用它应该具有的全部CPU,因为Docker自己共享资源。

示例:

环境:整个集群中有80个CPU内核的Kubernetes平台

测试1:

  • 上下文:1个单个pod限制为5个CPU核心
  • 进程:在单个pod中运行1个单进程
  • 持续时间:单个过程持续0:02:05

的Test2:

  • 上下文:12个pod限制为5个CPU核心
  • 进程:每个pod上运行12个进程
  • 持续时间:处理每一个
  • 需要平均0:03:55

这意味着当有多个容器请求CPU资源时,CPU使用率会受到影响(然后处理时间会增加)。

我想Docker并不打算像我需要的那样使用。

据我所知,在这种情况下,最好使用VM而不是Docker容器,但有没有办法让它工作(可能更改Docker或Kubernetes配置)?

任何有用的评论都将不胜感激。

2 个答案:

答案 0 :(得分:0)

由于我们不了解您的群集设置以及您实际处理的内容,因此很难给出确切的答案。但是,我认为差异是因为CPU份额约束没有达到您的想象。

来自你链接的docker文档:

  

该比例仅适用于CPU密集型进程运行时。当一个容器中的任务空闲时,其他容器可以使用剩余的CPU时间。

这意味着在您第一次测试时,即使您将CPU份额限制为5, IF 该主机上没有其他任何运行,它将继续增加CPU使用率,直到100%该主机上的CPU时间已用完。

在12处理器的情况下,这些容器中的每一个实际上与主机上的其他容器竞争CPU资源,因此仅接收整个主机系统CPU的一部分。它们每个都将获得相同的总CPU时间份额,但该份额仍将小于接收所有CPU时间。

您可以使用--cpu的标志,而不是使用CPU共享来限制资源。这将为您提供我认为您实际上想要实现的cpu使用限制。

  

指定容器可以使用的可用CPU资源量。例如,如果主机有两个CPU并且你设置了--cpus =“1.5”,那么容器将保证能够访问最多一个半CPU。这相当于设置--cpu-period =“100000”和--cpu-quota =“150000”。可在Docker 1.13及更高版本中使用。

Docker Resource Constraints Documentation

答案 1 :(得分:0)

这可能为时已晚,但我想在 user2566987's 答案中添加一个补充,在 Kubernetes 中,有一个名为 cpu manager policy 的东西,默认情况下它的行为与上述答案相似,但是还有另一种策略是 static 模式,它将通过从共享 CPU 池中删除它们来保留您想要的 CPU,这将保证 pod 获得独占 CPU 时间而不会被共享。

这需要将 pod 请求和限制设置为相等(保证服务质量类)并使它们为整数 >= 1。