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

Dav*_*rdi 5 threads multi-threading cpu-usage kubernetes

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

        resources:
          limits:
            cpu: "500m"
Run Code Online (Sandbox Code Playgroud)

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

根据我的理解,当限制小于 1000 毫核时,pod 永远不可能有多个线程并行运行。这是对的吗?

Mar*_*rco 5

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

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

docker run -it  --cpus=".5" --cpuset-cpus="0,1" polinux/stress stress --cpu 2
Run Code Online (Sandbox Code Playgroud)
%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
Run Code Online (Sandbox Code Playgroud)


cod*_*ger 3

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

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