linux autogroup

发布于:2024-04-24 ⋅ 阅读:(24) ⋅ 点赞:(0)

一:概述

对于linux autogroup的作用,很多同学可能是听说过,但,并未验证过。

考虑下面场景,开两个terminal,T1和T2,在T1中运行进程P1,P1开启9个线程编译代码,在T2中运行进程P2,P2开启1个线程编译代码,那么,在top命令中查看cpu使用率时,P1和P2各占据 多少CPU呢?

我们的期待是:

1. 当未开启linux autogroup时,P1 90%,P2 10%

2. 当已开启linux autogroup时,P1 50%,P2 50%

让我们使用下面的配置来进行验证

marvin@vm:~$ uname -a
Linux vm 6.5.0-28-generic #29~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Apr  4 14:39:20 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
marvin@vm:~$ 

二:autogroup不符合预期

1. 未开启linux autogroup时,如下所示。确实 h1 90%, h2 10%。符合预期。

2. 已开启linux autogroup时,如下图所示,很不幸,依然是 h1 90%, h2 10%。不符合预期。

三:不符合预期的直接原因

在已开启linux autogroup的情况下,为什么CPU并未均分呢?从下图可以看到,无论是否开启autogroup,h1和h2的 "cpu,cpuacct" 都位于 /user.slice这个cgroup下面。

而,sched(7) - Linux manual page根据autogroup文档,进程只有当位于root cgroup下时,autogroup才会起作用。

sched(7) - Linux manual page

四:放入root cgroup,则一切符合预期

于是,我们开启autogroup,然后,启动进程h1和h2,然后,我们将两个进程都移动进root cgroup中。

果然看到效果啦,h1 9个线程,h2 1个线程,但,两者确实平分CPU的。很好,符合预期啦。

还需要注意到:

如果一开始autogroup是开启的,然后,我们将进程移动到root cgroup,于是,h1和h2各占50% CPU。

如果一开始autogroup是关闭的,然后,我们将进程移动到root cgroup,然后,我们再打开autogroup,此时,autogroup依然是无效的。(也就说,动态修改autogroup后,已移动进root cgroup中的进程 依然不会按着 开启autogroup 执行)。

五:systemd的原因?

为什么在不同terminal中运行的进程,却位于user.slice中呢?这应该是systemd的原因,当有了systemd之后,autogroup应该是无法起作用了,systemd会将terminal启动的进程都放置到user.slice中(而不是root cgroup)。但,具体为什么会这样,不知道,后面研究吧!

六:参考

2024年的Linux的进程优先级与nice值

Linux 的进程优先级与 nice 值 - 依云's Blog