为什么在 Linux KVM 下运行的 Windows 7 VM 没有使用所有虚拟处理器?

为什么在 Linux KVM 下运行的 Windows 7 VM 没有使用所有虚拟处理器?

全部

自从我将我的一台虚拟机从 Windows 2008 Server 迁移到 Windows 7(旗舰版)以来,我的服务器就出现了问题:虽然我已经为虚拟机分配了四个核心,而且它似乎看到了它们,但它似乎认为它有两个核心!

它识别我的处理器但不使用它们!

有人能告诉我这是怎么回事吗?我以为可能是 KVM 和 Windows 7 之间不兼容,但由于它看到了虚拟处理器,我开始认为不是……有什么线索吗?

下面是进程管理器的屏幕截图,其中仅显示同一盒子上有两个核心:

任务管理器

答案1

我怀疑这些处理器是作为单独插槽中的单核处理器提供的。Windows 7 Ultimate 支持最多 2 个插槽系统,因此它将使用 2 个处理器。

我不知道您是否可以配置 KVM 以将处理器显示为单个四核 CPU 或 2 个双核 CPU,这应该可以解决问题。

答案2

在 libvirt 0.8.3 上,如果您输入:

virsh capabilities | grep topology

它将列出主机的拓扑:

<topology sockets='1' cores='4' threads='1'/>

这些数字指的是插槽数、每插槽核心数和每核心线程数。将此行添加到 xml 文件中的 cpu 条目,以允许 Windows 使用所有 4 个核心,例如:

 <vcpu>4</vcpu>
 <cpu>
     <topology sockets='1' cores='4' threads='1'/>
 </cpu>

答案3

自 Ubuntu 15.04 起,virt-manager 完全支持拓扑设置。

从 virt-manager > CPU > 拓扑:

  • 检查:手动设置 CPU 拓扑
  • 插槽: 2
  • 核心数:2
  • 主题:2

以下内容是根据 virt-manager 中的上述设置创建的。您无需使用 virsh edit 输入这些内容。

<vcpu placement='static'>8</vcpu>
<cpu mode='host-model'>
  <model fallback='allow'/>
  <topology sockets='2' cores='2' threads='2'/>
</cpu>

更新后,Windows 不再识别拓扑,并且再次将虚拟 CPU 限制为 2 个插槽。

要解决此问题,请使用“virsh edit”隐藏 kvm 功能并添加 hyperv 功能。完全关闭并重新启动后,Windows VM 将再次识别多个 CPU。

为什么在 Linux KVM 下运行的 Windows 7 VM 没有使用所有虚拟处理器?

<features>
  <acpi/>
  <apic/>
  <hyperv>
    <relaxed state='on'/>
    <vapic state='on'/>
    <spinlocks state='on' retries='8191'/>
  </hyperv>
  <kvm>
    <hidden state='on'/>
  </kvm>
</features>

答案4

值得注意的是,Ubuntu 10.4(Lucid)的 libvirt 版本为 0.7.5,而支持拓扑已添加到 libvirt 0.7.6 版本中。Ubuntu 10.10 (Maverick) 有 0.8.3 libvirt,因此应该能够直接支持 XML 中的拓扑规范,而无需包装器。

相关内容