我正在尝试建立一个系统,让我在一组主机上拥有一些进程,这些主机位于一个(屏蔽)cpuset 中,而其他所有内容(即所有虚拟机)都在另一个主机中。这里的目标是拥有一个超融合系统,其中虚拟机在任意一组 CPU 内核上运行,而存储进程在其他内核上运行,并具有隔离性。我选择了 cpuset 来完成这项任务,因为这似乎是“最简单”的方法。
但是,这似乎无法正常工作。首次设置 cset shield 时可以移动 VM,但稍后启动 VM 会导致如下错误:
libvirt: Cgroup error : Invalid value '0-31' for 'cpuset.cpus': Invalid argument
显然,它试图将虚拟机放在不允许的根 cset 中。这是一个非常默认的配置,只需指定 VM 中的核心数量,无需考虑单个 CPU ID 或任何此类调整(这是此设置工作的要求;节点可能是不对称的,具有不同的核心数量、拓扑等,而虚拟机可以在它们周围实时迁移)。
但总的来说,我想知道:是否可以将 Libvirt/KVM 配置为默认使用特定的 cpuset,而无需以任何方式重新配置 VM(无需手动配置 CPU 固定恶作剧),并且无需任何手动调整 per-工艺依据?
在基于 systemd 的主机上,所有虚拟机都放置在下面的 cgroup 中,
/machine.slice
因此如果您为其设置 CPU 掩码,/machine.slice
它将适用于所有虚拟机。同样,如果您设置CPUAffinity
,/etc/systemd/system.conf
则可以使所有非 VM 进程避免使用用于 VM 的 CPU。