我在一台单核机器上有3个进程。每个进程都完全相同,并且会尽可能快地消耗 CPU(紧密循环)。其中两个 (A
和B
) 是通过 cgexec 在不同的组中启动的,份额设置为 512 和 512。第三个 ( C
) 是定期启动的,而不是通过 cgexec 启动。
一旦全部启动并运行,C
即可获得 66% 的 CPU,同时A
分配B
33%。如果我杀了然后C
每人获得 50%(如预期)。A
B
为什么能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%。