cgroups 如何与非 cgrouped 进程交互?

cgroups 如何与非 cgrouped 进程交互?

我在一台单核机器上有3个进程。每个进程都完全相同,并且会尽可能快地消耗 CPU(紧密循环)。其中两个 (AB) 是通过 cgexec 在不同的组中启动的,份额设置为 512 和 512。第三个 ( C) 是定期启动的,而不是通过 cgexec 启动。

一旦全部启动并运行,C即可获得 66% 的 CPU,同时A分配B33%。如果我杀了然后C每人获得 50%(如预期)。AB

为什么能C得到66%?在这种情况下,我预计各为 33%,或者可能为 50% (C)、25% (A) 和 25% (B)。C不管我怎么算,66% 都算不出来。

一般来说,我想了解在资源共享方面(特别是CPU,但如果不太复杂的话,更一般的答案将不胜感激),在没有cgexec与启动的进程交互的情况下启动的进程是如何启动的。cgexec

答案1

Cgroup 是分层的,并且由所有子进程继承。因此所有进程都必须位于某个 cgroup 中。默认情况下,它是根 cgroup,默认情况下它有 1024 个共享,是示例中 A 和 B 的两倍。

CPU 时间根据 cpu.shares 中分配给 cgroup 的权重在 cgroup 之间共享。

如果 A 有 1024 个共享,B 有 512 个共享,C 有 256 个共享,D 有 256 个共享,则 CPU 时间分布应为 A - 50%、B - 25%、C 和 D 12.5%。

相关内容