如何在 WSL2 中启用 cgroup v2?

Iva*_*iuk 22 ubuntu cgroups windows-subsystem-for-linux

访问仅具有 Windows 计算机的支持 cgroup v2 的系统的最简单方法是生成托管 Ubuntu 22.04 的 WSL2 实例。不幸的是,有一个问题。删除 v1 控制器不会导致该控制器添加到 v2 层次结构中。

默认情况下,WSL2 同时启用cgroup v1cgroup v2层次结构,所有控制器都位于v1中:

$ mount -l | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,relatime,mode=755)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu type cgroup (rw,nosuid,nodev,noexec,relatime,cpu)
cgroup on /sys/fs/cgroup/cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
Run Code Online (Sandbox Code Playgroud)

我尝试使用 删除v1控制器$ umount /sys/fs/cgroup/*。这似乎从列表中删除了cgroup v1控制器$ mount | grep cgroup但随后v2 ( )中没有添加任何内容/sys/fs/cgroup/unified

如果我正确理解cgroup v2 官方文档,则只有当该控制器不再处理任何进程时,该控制器才可以移动到cgroup v2 。

如何为cgroup v2启用“cpu”和“内存”等控制器?

Iva*_*iuk 28

从 Linux v5.0 开始,内核引导选项cgroup_no_v1=<list_of_controllers_to_disable>可用于禁用cgroup v1层次结构。因此,您的计算机应该仅以 cgroup v2 启动。

对于 WSL,微软文档说我们必须创建%UserProfile%\.wslconfig包含以下内容的文件:

[wsl2]
kernelCommandLine = cgroup_no_v1=all
Run Code Online (Sandbox Code Playgroud)

就是这样。
确保使用命令重新启动WSL > wsl.exe --shutdown
您可以看到文件中已启用的控制器<cgroup_fs_mount_point>/cgroup.controllers

额外调整:

  1. 默认情况下,cgroup2 可能会安装在/sys/fs/cgroup/unified. 有些应用程序可能不喜欢它(特别是 docker)。将其移动到常规位置:
$ mount --move /sys/fs/cgroup/unified /sys/fs/cgroup
Run Code Online (Sandbox Code Playgroud)
  1. 您可以通过编辑文件来达到类似的效果/etc/fstab
cgroup2 /sys/fs/cgroup cgroup2 rw,nosuid,nodev,noexec,relatime,nsdelegate 0 0
Run Code Online (Sandbox Code Playgroud)

收据 #2 有一个副作用,即原始 cgroup 挂载点/sys/fs/cgroup/unified保持“悬空”。您可以通过运行$ mount | grep cgroup2或查看/proc/self/mountinfo文件来看到这一点。#2 的好处是在这种情况下docker服务启动时没有任何问题。因此,如果您可以容忍悬空安装,/etc/fstab则首选该方法。

  • 太棒了 - 当您上个月发布时,我认为这是一个很好的问题(因此投票了),很高兴看到您能够找到并发布详细的解决方案(因此也投票了答案)。令人惊讶的是没有人对此感兴趣,但我想没有多少人像我一样经常关注这里的 [tag:windows-subsystem-for-linux] 标签。 (3认同)