cgroup 是键值对列表还是一组进程?

cgroup 是键值对列表还是一组进程?

我认为 cgroup 是一组满足某些条件的进程,来自http://man7.org/linux/man-pages/man7/cgroups.7.html

一个cgroup是进程的集合绑定到通过 cgroup 文件系统定义的一组限制或参数。

我是否正确地找出具有给定 PID 的进程的 cgroup,只需运行

$ cat /proc/11/cgroup
12:perf_event:/
11:blkio:/
10:hugetlb:/
9:freezer:/
8:pids:/
7:cpuset:/
6:devices:/
5:cpu,cpuacct:/
4:rdma:/
3:memory:/
2:net_cls,net_prio:/
1:name=systemd:/
0::/

我以为cgroup是一个id号。但它是一个键值对列表。上面的键值对列表是否代表进程列表?

我可以找出同一个cgroup中的所有进程吗?

谢谢。

答案1

正如您所引用的手册页中所示,cgroup 是一组进程。

的内容/proc/11/cgroup描述了进程11所属的所有控制组。对于 v1 组,每行的第一个字段是层次结构 id,第二个字段是控制器列表,第三个字段是层次结构中 cgroup 的路径名。对于 v2 组,第一个字段为 0,第二个字段为空,第三个字段为路径名。

查找某个cgroup中的所有进程,查看tasks对应sysfs目录下的文件,例如

cat /sys/fs/cgroup/perf_event/tasks

对应于12:perf_event:/

| /sys/fs/cgroup/ | perf_event | / | tasks
|                 |            |   |
|<  mountpoint   >|<controller>| ^ |
                                 |
               cgroup pathname --+

答案2

斯蒂芬·基特嘲笑你在坏例子上解释路径结构。因此,下面是一个很好的例子。让我们列出与进程 PID 1595 相关的 cpu 控制器 cgroup 中的任务。cat /proc/1595/cgroup给我们

12:hugetlb:/
11:rdma:/
10:net_cls,net_prio:/
9:freezer:/
8:blkio:/system.slice/containerd.service
7:cpuset:/
6:cpu,cpuacct:/system.slice/containerd.service
5:devices:/system.slice/containerd.service
4:pids:/system.slice/containerd.service
3:memory:/system.slice/containerd.service
2:perf_event:/
1:name=systemd:/system.slice/containerd.service
0::/system.slice/containerd.service

因此, CPU 控制器行是6:cpu,cpuacct:/system.slice/containerd.service可以从中读取组中进程的列表/sys/fs/cgroup/cpu/system.slice/containerd.service/tasks。请注意,该tasks文件还列出了线程。这条路径代表了cgroups资源分配的层次结构,system.slice是父组的containerd.service。斯蒂芬在根路径示例中解释了这一点,/路径中只有一个路径,这确实没有意义。

如果您只需要快速查看层次结构,您可以调用systemd-cgls cpu它为您检查这个低级别的 procfs 文件并绘制一棵漂亮的树。

相关内容