我可以在 CPU 限制设置为 500 毫核的 pod 中并行运行多个线程吗?

我可以在 CPU 限制设置为 500 毫核的 pod 中并行运行多个线程吗?

我有一个多核 Kubernetes 集群,其中有多个 pod,它们的 CPU 限制配置为 500 毫核:

        resources:
          limits:
            cpu: "500m"

在单个 pod 中,可以有多个线程并行运行(同时,在同一时刻)吗?

据我了解,当限制小于 1000 毫核时,pod 永远无法并行运行多个线程。这是正确的吗?

答案1

是的,Kubernetes 中的 CPU 限制是使用 Linux CPU 配额子系统实现的(至少在 Linux 上如此,不确定在 Windows 上是否如此)。该系统的工作原理是为 cgroup 提供允许运行的时间片总数,并每隔几毫秒重新填充一次。如果某个任务(线程、进程)被标记为可运行,并且它所在的组有可用的配额令牌,那么它将像往常一样运行(并且存储桶会减少)。如果没有令牌,那么它将不会运行,并且会发出 timeslice_exceeded 事件。

设置 500m 的限制意味着令牌补充率将平均为每 1 秒挂钟时间允许 0.5 秒的运行时间。但是,如果您拥有一百万个核心,那么如果您的所有任务都可运行,那么您可以在一个瞬间使用所有这些令牌。

答案2

当然,您可以同时在容器中运行 2 个线程,每个线程使用 25% 的 CPU 时间。但是,至于这些线程是否会完全一起运行,我不能 100% 确定。

运行以下测试似乎表明它可以:

docker run -it  --cpus=".5" --cpuset-cpus="0,1" polinux/stress stress --cpu 2
%Cpu0  : 29.6 us,  0.0 sy,  0.0 ni, 70.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  : 29.6 us,  0.0 sy,  0.0 ni, 70.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

相关内容