我有一个使用大量CPU的应用程序。我认为在Kubernetes中将工作量分配给小部分工作,然后我创建了几个CPU限制的pod。事实证明,Docker有一个约束,它在所有运行CPU密集型进程的容器(https://docs.docker.com/engine/reference/run/#cpu-share-constraint)之间分配CPU总量。出于这个原因,每个pod都不能使用它应该具有的全部CPU,因为Docker自己共享资源。
示例:
环境:整个集群中有80个CPU内核的Kubernetes平台
测试1:
的Test2:
这意味着当有多个容器请求CPU资源时,CPU使用率会受到影响(然后处理时间会增加)。
我想Docker并不打算像我需要的那样使用。
据我所知,在这种情况下,最好使用VM而不是Docker容器,但有没有办法让它工作(可能更改Docker或Kubernetes配置)?
任何有用的评论都将不胜感激。
答案 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及更高版本中使用。
答案 1 :(得分:0)
这可能为时已晚,但我想在 user2566987's 答案中添加一个补充,在 Kubernetes 中,有一个名为 cpu manager policy 的东西,默认情况下它的行为与上述答案相似,但是还有另一种策略是 static
模式,它将通过从共享 CPU 池中删除它们来保留您想要的 CPU,这将保证 pod 获得独占 CPU 时间而不会被共享。
这需要将 pod 请求和限制设置为相等(保证服务质量类)并使它们为整数 >= 1。