除非声明拓扑,否则为什么分配给虚拟机的 vCPU 数量错误?

除非声明拓扑,否则为什么分配给虚拟机的 vCPU 数量错误?

我在具有两个 Xeon E5-2680v2 @ 2.8GHz CPU 的 MPU 系统上运行 kvm。我的所有虚拟机都是 Windows 机器,主要是版本 10。libvirtd 是版本 5,尽管我在早期版本中也遇到了所描述的问题。

至于CPU模式,我使用“主机直通”配置,以便虚拟机可以使用 CPU 的整个功能集。

<vcpu placement='static'>6</vcpu>
<cpu mode='host-passthrough' check='partial'/>

现在,这是我有点迷失的地方。假设我如上所述配置了一个具有 6 个 vCPU 的虚拟机,并且没有指定拓扑(这似乎是有效的做法),那么我的 Windows VM 声称它总共可以访问 2 个套接字,并且只能访问 2 个虚拟处理器。这不仅仅是显示内容的问题,它清楚地反映在性能中。

一旦我指定拓扑并将上面的行更改为如下所示:

<vcpu placement='static'>6</vcpu>
<cpu mode='host-passthrough' check='partial'>
   <topology sockets='1' cores='6' threads='1'/>
</cpu> 

Windows VM 现在可以识别正确的 vCPU 数量,并且性能也会相应提高。

虽然我知道拓扑在套接字、处理器和线程的分布方式方面可能有所不同,但除非指定拓扑,否则不会为虚拟机提供正确的 vCPU 总数,这似乎很奇怪。

虽然我很高兴它现在工作正常,但我仍然想更好地理解为什么这个问题存在,以及我是否选择了解决它的最佳方法。

答案1

距离我在这里问已经过去一年多了,我自己可能已经有了答案。

虽然我在 libvirt 本身的网站上找不到任何证实的信息,但在OpenStack 维基它说:

libvirt 驱动程序会将所有 vCPU 公开为单独的套接字,具有 1 个核心且无超线程。

虽然很高兴看到 libvirt 项目本身有如此清晰的解释,但这似乎确实得到了我在问题中提到的我自己的观察的证实。因此,如果属实,那么很明显为什么我的 Windows 10 Pro 虚拟机不会显示正确的 vCPU 数量:Windows 10 Pro 仅限于两个物理插槽,如中所述这篇维基百科文章。可以肯定地说,libvirt 正在创建 6 个套接字,其中 Windows 10 Pro 只允许其中 2 个,这解释了我所描述的行为。

相关内容