【问题标题】:Kubernetes CPU multithreadingKubernetes CPU 多线程
【发布时间】:2018-11-13 08:05:10
【问题描述】:

我有一个 4 核 CPU,我创建了一个 CPU 资源限制为 100m 的 Kubernetes Pod,这意味着它将占用 1/10 的核心功率。

我想在这种情况下,100m 甚至不是一个完整的核心,如果我的应用程序是多线程应用程序,我的应用程序的线程会并行运行吗?还是所有线程都只运行在核心部分(100毫核)?

谁能进一步解释背后的机制?

【问题讨论】:

  • 您的应用使用应用程序用户空间线程或操作系统/内核线程?
  • @IjazAhmadKhan 我的应用是 java 应用,它使用 java 线程特性来创建新线程。
  • 确保检查您的应用正在考虑多少线程。在您的应用程序运行的完整 Kubernetes 节点中有许多线程(50 多个),但您的应用程序可能只需要少数几个。如果应用程序试图一次利用可用的最大值,您的线程可能会相互绊倒。指定你想要的线程数(例如 4)来解决这个问题。

标签: kubernetes cpu


【解决方案1】:

到目前为止我找到的最接近的答案是one

对于单线程程序,0.1 的 cpu 使用率意味着如果你 可以在随机的时刻冻结机器,看看什么 每个核心都在做,你的单线程有十分之一的机会 在那一刻正在运行。机器上的核心数 不影响0.1的意义。对于具有多个线程的容器, 容器的使用量是其线程使用量的总和(根据之前的 定义。)无法保证您在哪个内核上运行,并且 你可能会在你的不同点上运行不同的核心 容器的生命周期。 cpu 限制为 0.1 意味着您的使用量不是 允许在很长一段时间内超过 0.1。一个 CPU 请求 0.1 表示系统将尝试确保您能够 如果您的线程没有阻塞,则 cpu 使用率至少为 0.1 经常。

我认为以上听起来很合乎逻辑。根据我的问题,100m 的 CPU 核心能力将分布在所有 CPU 核心上,这意味着多线程应该在 Kubernetes 中工作。

更新:

另外,这个answer 解释得很好,虽然它可能在单核中运行一个线程(或者根据问题少于一个核心功率),但由于操作系统的调度能力,它仍然会尝试运行指令单元并行,但不超过规定的时钟功率(根据问题100m)。

【讨论】:

    【解决方案2】:

    看一下this documentation与Kubernetes中的资源相关:

    您可以使用文章中描述的资源:

    要指定一个容器的 CPU 请求,包括 容器资源清单中的resources:requests 字段。到 指定 CPU 限制,包括 resources:limits

    在本练习中,您将创建一个包含一个 Container 的 Pod。这 容器的请求为 0.5 个 CPU,限制为 1 个 CPU。这里是 Pod 的配置文件:

    apiVersion: v1
    kind: Pod
    metadata:
      name: cpu-demo
      namespace: cpu-example
    spec:
      containers:
      - name: cpu-demo-ctr
        image: vish/stress
        resources:
          limits:
            cpu: "1"
          requests:
            cpu: "0.5"
        args:
        - -cpus
        - "2"
    

    对您的问题的补充: 是的,它不会并行运行(多核线程)。但是您可以在 pod 中为您的应用程序显示几个核心,然后使用多线程来执行它。

    配置文件的args 部分为 容器启动时。 -cpus "2" 参数告诉 容器尝试使用 2 个 CPU。

    【讨论】:

    • vish/stress 图像中的工具是什么?
    【解决方案3】:

    我仔细查看了有问题的GitHub Issue Thread。线程中有一些来回,但我想我理解了它,并想分享一些到目前为止答案中似乎缺少的东西:

    【讨论】:

    • 我明白你的意思;但是“同时运行”和“并行运行”的意思是一样的。 Concurrently 表示“同时存在、发生或完成”。
    • 不过,它们不是一回事。同时意味着它们都发生在相同的时间跨度内,但并不一定意味着它们都能够在该时间跨度内的完全相同的时刻完成工作。并行意味着它们可以在完全相同的时间同时工作。