如何检查我的计算机上是否安装了 cgroup v2?

如何检查我的计算机上是否安装了 cgroup v2?

我想尝试 cgroup v2 但不确定它是否安装在我的 Linux 机器上

>> uname -r
4.14.66-041466-generic

由于 cgroup v2 在 4.12.0-rc5 中可用,我认为它应该在我使用的内核版本中可用。

https://www.infradead.org/~mchehab/kernel_docs/unsorted/cgroup-v2.html

但是,我的系统似乎没有 cgroup v2,因为其文档中提到的内存接口文件在我的系统上不可用。

https://www.kernel.org/doc/Documentation/cgroup-v2.txt

看来我还有cgroup v1。

/sys/fs/cgroup/memory# ls
cgroup.clone_children  memory.kmem.failcnt                 memory.kmem.tcp.usage_in_bytes   memory.memsw.usage_in_bytes      memory.swappiness
cgroup.event_control   memory.kmem.limit_in_bytes          memory.kmem.usage_in_bytes       memory.move_charge_at_immigrate  memory.usage_in_bytes
cgroup.procs           memory.kmem.max_usage_in_bytes      memory.limit_in_bytes            memory.numa_stat                 memory.use_hierarchy
cgroup.sane_behavior   memory.kmem.slabinfo                memory.max_usage_in_bytes        memory.oom_control               notify_on_release
docker                 memory.kmem.tcp.failcnt             memory.memsw.failcnt             memory.pressure_level            release_agent
memory.failcnt         memory.kmem.tcp.limit_in_bytes      memory.memsw.limit_in_bytes      memory.soft_limit_in_bytes       tasks
memory.force_empty     memory.kmem.tcp.max_usage_in_bytes  memory.memsw.max_usage_in_bytes  memory.stat 

后续问题 感谢布莱恩的帮助。请让我知道我是否应该创建一个新问题,但我认为如果我只是在这里提出我的问题,这可能会对其他人有所帮助。

1)我无法按照文档中的命令添加 cgroup 控制器

>> echo "+cpu +memory -io" > cgroup.subtree_control

但是,我收到“echo:写入错误:参数无效”。我是否缺少此步骤的先决条件?

2)我运行了一个docker容器,但docker守护进程日志抱怨无法找到“/sys/fs/cgroup/cpuset/docker/cpuset.cpus”。看来 docker 仍在期待 cgroupv1。在我的 docker 守护进程上启用 cgroupv2 支持的最佳方法是什么?

docker -v
Docker version 17.09.1-ce, build aedabb7

答案1

您可以运行以下命令:

grep cgroup /proc/filesystems

如果您的系统支持 cgroupv2,您将看到:

nodev   cgroup
nodev   cgroup2

在只有 cgroupv1 的系统上,您只会看到:

nodev   cgroup

答案2

最简单的方法是尝试挂载伪文件系统。如果您可以将其安装到某个位置,那么您可以尝试使用以下界面管理进程:

mount -t cgroup2 none $MOUNT_POINT

我看到您引用了上面的文档。您可能忽略的一点是仍然需要创建路径。没有原因必须管理任何特定位置的 cgroup 资源。这只是惯例。

例如,只要目录存在,您就可以完全出现procfs在...:/usr/monkeys/usr/monkeys

$ sudo mkdir /usr/monkeys
$ sudo mount -t proc none /usr/monkeys
$ ls -l /usr/monkeys
...
...
-r--r--r--.  1 root        root                      0 Sep 25 19:00 uptime
-r--r--r--.  1 root        root                      0 Sep 25 23:17 version
-r--------.  1 root        root                      0 Sep 25 23:17 vmallocinfo
-r--r--r--.  1 root        root                      0 Sep 25 18:57 vmstat
-r--r--r--.  1 root        root                      0 Sep 25 23:17 zoneinfo
$ sudo umount /usr/monkeys

以同样的方式,我可以使用 cgroup v2 伪文件系统执行此操作:

$ sudo mount -t cgroup2 none /usr/monkeys
$ ls -l /usr/monkeys
total 0
-r--r--r--.  1 root root 0 Sep 23 16:58 cgroup.controllers
-rw-r--r--.  1 root root 0 Sep 23 16:58 cgroup.max.depth
-rw-r--r--.  1 root root 0 Sep 23 16:58 cgroup.max.descendants
-rw-r--r--.  1 root root 0 Sep 23 16:58 cgroup.procs
-r--r--r--.  1 root root 0 Sep 23 16:58 cgroup.stat
-rw-r--r--.  1 root root 0 Sep 23 16:58 cgroup.subtree_control
-rw-r--r--.  1 root root 0 Sep 23 16:58 cgroup.threads
drwxr-xr-x.  2 root root 0 Sep 23 16:58 init.scope
drwxr-xr-x.  2 root root 0 Sep 23 16:58 machine.slice
drwxr-xr-x. 59 root root 0 Sep 23 16:58 system.slice
drwxr-xr-x.  4 root root 0 Sep 23 16:58 user.slice
$ sudo umount /usr/monkeys

答案3

不仅查看是否支持 cgroups v2,而且查看它们是否已启用以及是否可以使用以下命令可能并不相关:

stat -fc %T /sys/fs/cgroup/

如果输出状态cgroup2fs则使用 cgroup v2,tmpfs如果是 cgroup v1。如果系统支持 cgroups v2,但默认情况下未激活,则可以通过设置systemd.unified_cgroup_hierarchy=1内核参数来启用它(例如,GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=1"在具有 GRUB 的系统中)

答案4

有些系统默认会挂载cgroup v1和cgroup v2,只是挂载在不同的位置。它可以帮助您查看这些内容在哪里:

grep ^cgroup /etc/mtab

示例输出(在 Ubuntu 20.04 LTS 上):

cgroup2 /sys/fs/cgroup/unified cgroup2 rw,nosuid,nodev,noexec,relatime 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,name=systemd 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpu,cpuacct 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/rdma cgroup rw,nosuid,nodev,noexec,relatime,rdma 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_cls,net_prio 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0

但是,这并不能严格告诉您您的系统是否支持cgroup v2.0正如另一个答案提到的,grep cgroup /proc/filesystems这非常有用。

相关内容