cgroup如何与非cgroup进程交互?


12

我在一台核心机器上有3个进程。每个进程都完全相同,并尽可能快地刻录CPU(紧密循环)。其中的两个(AB)与cgexec在单独的组中启动,并且共享设置为512和512。第三个(C)是定期启动的,而不与cgexec一起启动。

一旦一切就绪并运行,C即可获得66%的CPU AB拆分33%。如果我杀了C,然后AB获得各50%(预期)。

为什么C得到66%?在这种情况下,我希望每个人占33%,或者50%(C),25%(A)和25%(B)。C不管我怎么做数学,都会有66%的人无法解决问题。

总的来说,我想了解在资源共享(特别是CPU,但如果不太复杂的话,可以理解的话)下cgexec启动的进程如何与启动的进程进行交互cgexec


首先,我想知道如何测量CPU使用率百分比?您运行A,B和C的优先顺序是什么?
KWubbufetowicz

我相信我是测量CPU使用率有top,我相信他们从命令提示符,启动了相当简单:cgexec -g cpu:foo myprogram./myprogram。已经有一段时间了,所以我不确定。
米卡·佐尔图

myprogram是否可以使用多个单线程/进程?顺便说一句,您仍然有兴趣解决这个问题吗?
KWubbufetowicz

该程序是为测试此行为而编写的测试应用程序。故意使用单线程以缩小结果范围。我仍然对这个问题的答案感兴趣。
米卡·佐尔图

RedHat的此页面可能对您有帮助。 cpu.shares是一个非常特殊的配置选项;我建议如果可能的话,按CPU拆分cpuset.cpus
通配符

Answers:


3

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

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

如果A有1024个份额,B 512和C 256和D 256,则CPU时间分布应该是A-50%,B-25%,C和D 12.5%。


因此,未使用cgexec启动的任何进程都位于具有1024个份额的根cgroup中,并在所有直接子节点之间平均分配。一个这样的直接子对象是通过调用生成的cgroup cgexec。因此,非cgexec进程将获得50%,而cgrouped进程将全部共享剩余的50%。在cgroup过程中,它们平均分配50%的资源,这意味着两者都获得25%的资源。这是有道理的,但这不是我观察到的行为。我看到的是66%,33%和33%。您可以更新答案以包含更多详细信息,甚至可以包括示例分布吗?
米卡·佐尔图

哦,我想我明白了。在没有启动的情况下,操作系统上启动的任何进程都将cgexec获得1024个共享。启动任何进程cgexec都会获取指定的份额。因此,在这种情况下,一个进程获得1024个份额,而其他两个进程分别获得512个份额,这就是我看到的分布。您介意更新答案以使示例更加清晰吗?
Micah Zoltu'6

实际上,这仍然没有加起来。 1024 + 512 + 512 = 2048512/2048 == 25%。我认为这个答案实际上是正确的,至少表面上是不正确的。
米卡·佐尔图

您还有其他cgroup吗?它可能会影响数字。您还可以检查红帽文档,疗法是一个simmilar例如access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/...
Lazy404

没有其他重要的东西运行,在测试运行之前和之后,盒子都处于闲置状态。所有这些示例仅显示了使用cgroups安装程序启动所有进程时发生的情况。它没有讨论当某些进程不使用cgroups时会发生什么,这就是我试图找出的结果。
米卡·佐尔图
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.