我在 AWS/GCP 上有两个 32 vCPU 实例。我正在尝试设置 cpu 屏蔽,以便系统使用 CPU 0、1,而 cpus 2-31 被屏蔽并且仅由用户空间线程显式使用。
系统信息:
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Codename: jammy
$ cat /proc/filesystems | grep cpuset
nodev cpuset
但是,当我尝试运行时cset shield
,出现与安装有关的错误:
mount: /cpusets: none already mounted on /run/credentials/systemd-sysusers.service.
cset: **> mount of cpuset filesystem failed, do you have permission?
我深入研究了 cset 代码,失败的调用似乎是一个
$ sudo mount -t cpuset cpuset /cpusets
mount: /cpusets: cpuset already mounted or mount point busy.
/cpusets
是一个新创建的文件夹,并且$ cat /proc/mounts | grep cpuset
是空的——所以 cpuset 似乎没有安装在其他地方。
也许相关:
$ cat /proc/mounts | grep cgroup
cgroup2 /sys/fs/cgroup cgroup2 rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot 0 0
我的猜测是 AWS/GCP 将 cpuset 用于管理程序或类似的东西。是否可以在 AWS/GCP 上隔离 cpus?我该怎么办?
您正在使用已经安装了 v2(“统一”)cgroups 的 systemd,所以它不是您管理控制组 - 它是 systemd。通过文件部分中的
CPUAffinity=
和相关选项[Manager]
/etc/systemd/system.conf.d/50-my-cpuset-options.conf
告诉它这样做。然后,您可以CPUAffinity=
为那些希望从全局默认值中免除的特定 unit.service 文件使用(空以重置,非空以添加)。您甚至可以使用 systemd API 通过
systemctl --runtime set-property example.service ExampleOption=Value
命令暂时(直到重新启动)修改已在运行的服务上的资源选项。使用它来确认生成的 cgroup 设置并衡量它如何影响您的系统性能。我想,如果不是破坏调度程序利用 100% CPU 的能力,而是提高其全部能力,那么在拥塞情况下,您会看到明显更好的系统可靠性,而不是全局默认值。更紧密地匹配您的优先级使用Nice=
和IOSchedulingClass=
那些您确实想要运行但不想影响系统其余部分的特定低优先级异步后台任务 - 但不要使用亲和力大锤。理论上,像cset这样的实用程序可以更新为与这样的 cgroup2 系统管理器交互,并提供与以前有效相同的抽象,同时在后台修改 systemds
system.slice
和单元默认值,但这个讨论听起来到目前为止还没有人这样做过。而且由于包罗万象的巨型 C 代码块提供了更丰富、有据可查且可以说更通用的控制内核已经学会的所有整洁的东西,因此可能不再需要这样做。如前所述,systemd 创建了自己的 cgroup2 层次结构,根据我的需要,它不能很好地与 cset 配合使用。
我将以下内容添加到 /etc/default/grub 中的 GRUB_CMDLINE_LINUX_DEFAULT 值中,以在 Ubuntu 22.10 上禁用此行为。
完成后,该行看起来像这样:
完成后,您需要以 root 身份运行:
然后重启。重新启动后,我能够使用 CSET 成功屏蔽我的 Ryzen CPU 上的 CCX,并迁移所有用户空间和系统任务
如果您需要更多背景知识,这里有我遇到的这个问题的更多参考资料: https ://github.com/systemd/systemd/issues/13477#issuecomment-528113009 https://github.com/lxc/lxd/issues/ 10441