如何根据虚拟机的工作负载动态分配/扩展 QEMU VM 的 CPU 资源?这需要脚本吗?在运行时是否可以更改 CPU 分配?
我有一个 Windows 客户机和一个 Linux 主机。
答案1
简短回答:不用费心去做这些。只需告诉您的客户机它需要多少个 vCPU,然后让 Linux 主机来管理它们。
长答案:支持通过virsh setvcpus
命令动态添加和删除 vCPU。但是,对于一般情况来说,它的使用比较困难且不切实际。
第一个问题是,您无法添加比域 xml 文件中配置的最大 vCPU 更多的 vCPU。例如,一个配置了 1 个当前/最大 vCPU 的客户端。运行该命令virsh setvcpus MyGuest 2
返回以下错误:
error: invalid argument: requested vcpus is greater than max allowable vcpus for the live domain: 2 > 1
因此,您需要调整(提高)最大 vCPU 数量前在运行时添加更多 CPU。但是,更改最大 vCPU 数量需要重新启动整个域(即:关闭 - 配置编辑 - 启动)。
话虽如此,人们可能会倾向于“超额认购”最大 vCPU 数量,同时让当前 vCPU 保持在更合理的水平(即:设置 4 个最大 vCPU,但当前只有 1 个处于活动状态)。这样做确实足以在运行时管理 CPU,因为现在virsh setvcpus MyGuest 2
返回时没有错误。查看客户机,您可以看到新添加的 CPU:
# dmesg
[ 39.814166] CPU1 has been hot-added
# lscpu
CPU(s): 2
On-line CPU(s) list: 0
Off-line CPU(s) list: 1
然而,新添加的CPU离线,这意味着客户机将不会使用它。必须通过 启用新 CPU chcpu -e 1
。或者,您可以将“--guest”参数传递给virsh
运行的命令virsh setvcpus MyGuest 2 --guest
,但这需要与客户机中的 qemu-agent 建立有效连接,否则您将收到以下错误:
error: argument unsupported: QEMU guest agent is not configured
移除 CPU 更容易,因为virsh setvcpus MyGuest 1
即使没有代理连接,运行也会离线并从您的客户机中移除 vCPU。