为什么 systemd 在这两个系统上映射的 cgroup 不同

eew*_*nco 7 systemd cgroups linux-kernel

我有两个系统,都运行 OpenSuSE 12.2 (Mantis) 的定制变体,都运行完全相同的内核。我在两个系统上/proc/self/cgroup/proc/$$/cgroup在两个系统上得到两个非常不同的输出:

系统 A(或股票 OpenSuSE 12.1):

cat /proc/self/cgroup 
9:perf_event:/
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct,cpu:/
2:cpuset:/
1:name=systemd:/user/root/6
Run Code Online (Sandbox Code Playgroud)

系统B:

root@msx:/sys/fs/cgroup> cat /proc/self/cgroup 
9:perf_event:/
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct,cpu:/system/serial-getty@.service/ttyS0
2:cpuset:/
1:name=systemd:/system/serial-getty@.service/ttyS0
Run Code Online (Sandbox Code Playgroud)

为什么第 1 行不同,为什么第 3 行在一个中出现而在另一个中不存在?我找不到两个系统之间的配置差异。它们运行相同版本的 systemd ( systemd-44-10.1.1.x86_64)。如果我复制 sysctl 值,它就没有效果。引导选项是相同的。我比较了/etc/usr、 中的所有内容,/lib看看是否有任何相关的配置差异。(安装了不同的 RPM,但没有一个提供任何系统配置文件,我想我删除了所有自定义 RPM。)

这不仅仅是一个好奇因素,因为在系统 B 上,我们无法创建SCHED_RR线程,但在系统 A 上,我们可以。如果我设置DefaultControllerNULLin /etc/systemd/system.conf,它会起作用,并且第 3 行消失(第 1 行保持不同)。如果我将调用 shell 的进程 ID 写入/sys/fs/cgroup/cpu,cpuacct

root@msx:/root> ./a.out
Creation of real-time thread FAILED - Operation not permitted
root@msx:/root> cat /proc/$$/cgroup
9:perf_event:/
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct,cpu:/system/sshd.service
2:cpuset:/
1:name=systemd:/system/sshd.service
root@msx:/root> echo $$ > /sys/fs/cgroup/cpu,cpuacct/tasks
root@msx:/root> ./a.out
root@msx:/root> cat /proc/$$/cgroup
9:perf_event:/
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct,cpu:/
2:cpuset:/
1:name=systemd:/system/sshd.service
Run Code Online (Sandbox Code Playgroud)

不知道为什么会这样。我的同事对问题的理解并不满意,因为它不需要更改此配置。

内核是 3.4.47,CONFIG_RT_GROUP_SCHED已启用,CONFIG_AUTOGROUP已启用(禁用仍然不起作用,但它确实以不同的方式失败)

这是/sf/ask/1428863551/的衍生产品。

eew*_*nco 1

有一个 system.conf 配置选项 DefaultControllers,它控制附加到哪些 cgroup 层次结构。默认是cpu。我将其设置为null,/proc/$$$/cgroup不再列出cpuacct,cpu下的getty进程,测试程序可以工作。我不知道为什么相同的配置文件(我使用的是两个系统上都使用的默认配置文件)产生了两个不同的结果。我不确定这是解决问题的最佳方法或它为什么有效。所以我改变了

#DefaultControllers=cpu
Run Code Online (Sandbox Code Playgroud)

DefaultControllers=
Run Code Online (Sandbox Code Playgroud)

/etc/systemd/system.conf成功了。