在 AWS/GCP 上隔離 CPU:安裝 cpuset 時發生錯誤

在 AWS/GCP 上隔離 CPU:安裝 cpuset 時發生錯誤

我在 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(“統一”)cgroup 的 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

相關內容