【问题标题】:Distributed CPU-intensive processes in Kubernetes/DockerKubernetes/Docker 中的分布式 CPU 密集型进程
【发布时间】:2017-03-10 14:01:25
【问题描述】:

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

例子:

环境:Kubernetes 平台在整个集群中提供 80 个 CPU 内核

测试1:

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

测试2:

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

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

我猜 Docker 不打算按我的需要使用。

我知道在这种情况下使用虚拟机而不是 Docker 容器会更好,但是有没有办法让它工作(也许改变 Docker 或 Kubernetes 配置)?

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

【问题讨论】:

  • 您可以应用 cpu 约束,如果您的 pod 超过此值,它将被驱逐。

标签: docker kubernetes cpu-usage


【解决方案1】:

很难给出确切的答案,因为我们不了解您的集群设置以及您实际处理的内容。但是,我认为不同之处在于 CPU 份额限制并没有按照您的想法进行。

来自您链接的 docker 文档:

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

这意味着在您的第一次测试中,即使您将 CPU 份额限制为 5,如果该主机上没有运行任何其他内容,它将继续增加 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

【讨论】:

  • 如果你在 Kubernetes 上运行你的容器,它会覆盖现在在 Docker 中配置的任何东西,因此这种类型的配置必须通过 PodsNamespaces 来完成
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-03
    • 2013-07-31
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多