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

jkp*_*jkp 14 windows-7 multi-core kvm-virtualization

全部

自从我将其中一个 VM 从 Windows 2008 Server 迁移到 Windows 7(终极版)以来,我的服务器出现了问题:尽管我为 VM 分配了四个核心,它甚至似乎看到了它们,但它似乎认为它有两个核心!

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

谁能告诉我这里发生了什么?我认为这可能是 KVM 和 Windows 7 之间存在一些不兼容,但由于它看到了虚拟处理器,我开始认为不是......有任何线索吗?

这是进程管理器的屏幕截图,在同一个盒子上只显示了两个内核:

任务管理器

小智 24

在 libvirt 0.8.3 上,如果您键入:

virsh capabilities | grep topology
Run Code Online (Sandbox Code Playgroud)

它将列出主机的拓扑:

<topology sockets='1' cores='4' threads='1'/>
Run Code Online (Sandbox Code Playgroud)

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

 <vcpu>4</vcpu>
 <cpu>
     <topology sockets='1' cores='4' threads='1'/>
 </cpu>
Run Code Online (Sandbox Code Playgroud)


xen*_*nny 17

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

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

  • @Luca:实际上从 qemu 0.12 开始,您就可以更改拓扑。我已经升级了我的用户空间 kvm 组件,但我认为我需要新的内核模块才能让它工作......无论如何,它可以完成:) (2认同)

ric*_*usa 5

自 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>
Run Code Online (Sandbox Code Playgroud)

更新后,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>
Run Code Online (Sandbox Code Playgroud)