我有一个多核 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