我想尝试 cgroup v2 但不确定它是否安装在我的 linux 机器上
>> uname -r
4.14.66-041466-generic
Run Code Online (Sandbox Code Playgroud)
由于 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
Run Code Online (Sandbox Code Playgroud)
后续问题 感谢 Brian 的帮助。请让我知道我是否应该创建一个新问题,但我认为如果我在这里问我的问题可能对其他人有帮助。
1)我无法按照文档中的命令添加 cgroup 控制器
>> echo "+cpu +memory -io" > cgroup.subtree_control
Run Code Online (Sandbox Code Playgroud)
但是,我得到了“回声:写错误:无效的参数”。我是否缺少此步骤的先决条件?
2) 我运行了一个 docker 容器,但 docker 守护进程日志抱怨找不到“/sys/fs/cgroup/cpuset/docker/cpuset.cpus”。似乎 docker 仍在期待 cgroupv1。在我的 docker 守护进程上启用 cgroupv2 支持的最佳方法是什么?
docker -v
Docker version 17.09.1-ce, build aedabb7
Run Code Online (Sandbox Code Playgroud)
Wad*_* M. 33
您可以运行以下命令:
grep cgroup /proc/filesystems
Run Code Online (Sandbox Code Playgroud)
如果您的系统支持 cgroupv2,您将看到:
nodev cgroup
nodev cgroup2
Run Code Online (Sandbox Code Playgroud)
在只有 cgroupv1 的系统上,您只会看到:
nodev cgroup
Run Code Online (Sandbox Code Playgroud)
最简单的方法是尝试挂载伪文件系统。如果您可以将其安装到某个位置,那么您可以尝试使用该界面管理进程:
mount -t cgroup2 none $MOUNT_POINT
Run Code Online (Sandbox Code Playgroud)
我看到你引用了上面的文档。您可能遗漏的一点是仍然需要创建路径。您没有理由必须在任何特定位置管理 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
Run Code Online (Sandbox Code Playgroud)
以同样的方式,我可以使用 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
Run Code Online (Sandbox Code Playgroud)
要检查您的 Linux 系统是否支持cgroup v2,请检查是否存在cgroup.controllers
:
$ cat /sys/fs/cgroup/cgroup.controllers
cpuset cpu io memory hugetlb pids rdma
Run Code Online (Sandbox Code Playgroud)
要使用cgroup v2引导主机,请将以下字符串添加到GRUB_CMDLINE_LINUX
in 行/etc/default/grub
,然后运行sudo update-grub
:
systemd.unified_cgroup_hierarchy=1
也很有帮助 -检查您是否位于非特权命名空间中
小智 8
不仅查看是否支持 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 的系统中)