我在 AWS/GCP 上有两个 32 vCPU 实例。我正在尝试设置 CPU 屏蔽,以便系统使用 CPU 0、1,而 CPU 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 上隔离 CPU?我该怎么做?
答案1
您正在使用已安装 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=
,这些优先级是您想要运行但不想影响系统其余部分的特定低优先级异步后台任务 - 但不要使用亲和力大锤。
理论上,像设定值可以更新为与此类 cgroup2 系统管理器交互,并在后台修改 systemdssystem.slice
和单元默认值时提供与以前相同的抽象,但这个讨论听起来好像迄今为止还没有人这样做过。而且自从包罗万象的 C 代码块提供了更丰富、更有据可查、可以说是更加灵活的控制内核已经学会的所有巧妙的东西,可能不再需要了。
答案2
如上所述,systemd 创建了自己的 cgroup2 层次结构,根据我的需求,它与 cset 配合不佳。
我将以下内容添加到 /etc/default/grub 中的 GRUB_CMDLINE_LINUX_DEFAULT 值中,以在 Ubuntu 22.10 上禁用此行为。
完成后,该行将看起来像这样:
GRUB_CMDLINE_LINUX_DEFAULT="systemd.unified_cgroup_hierarchy=false <your_other_params>"
完成后你需要以 root 身份运行:
update-grub
grub-install
然后重启。重启后,我能够使用 CSET 成功屏蔽 Ryzen CPU 上的 CCX,并迁移所有用户空间和系统任务
如果您想了解更多背景信息,这里有我遇到的有关这个问题的更多参考资料: https://github.com/systemd/systemd/issues/13477#issuecomment-528113009 https://github.com/lxc/lxd/issues/10441