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


12

所有

自从我的一个虚拟机从Windows 2008 Server迁移到Windows 7(最终版)以来,我的服务器出现了问题:尽管我已经为虚拟机分配了四个核心,甚至看上去也能看到它们,但似乎还是认为有两个核心!

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

谁能告诉我这是怎么回事?我以为KVM和Windows 7之间可能不兼容,但是既然看到了虚拟处理器,我就开始不觉得……有什么线索吗?

这是流程管理器的屏幕快照,在同一框中仅显示两个内核:

任务管理器


您确定它没有显示两个双核proc吗?
phoebus 2010年

@phoebus:我确实很纳闷,但是在运行处理器的所有Windows版本中,在处理器监视器中看到四个内核之前,我都不在这里。
jkp'1

当您说处理器监视器时,您是指任务管理器的性能监视部分吗?因为仅基于屏幕快照,您就可以看到两个两核处理器的证据。如果是这样,您应该在性能监视器中看到所有4个内核。如果您不这样做,那么是的,有些不可思议。
phoebus

@phoebus:是的,我的意思是任务管理器的性能监视部分。绝对对我来说似乎很
古怪

Answers:


17

我怀疑处理器是在单独的插槽中以单核处理器的形式出现的。Windows 7 Ultimate最多支持2个套接字系统,因此它将使用2个处理器。

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


1
没错 ATM无法更改拓扑。
卡·塔曼曼蒂

1
哇我不知道 感谢您正确地解决这个问题。@Luca:您知道是否计划提供这种支持?我实际上是在使用额外的两个内核,还是会浪费它们?
jkp 2010年

2
@Luca:实际上,由于qemu 0.12,您可以更改拓扑。我已经升级了我的用户空间kvm组件,但我想我需要新的内核mod才能正常工作....无论如何,它可以完成:)
jkp 2010年

啊,太酷了……我也应该升级:)
卡·泰塔曼蒂

请记住,您可以在当前较旧的内核上运行最新的kvm内核模块。除非您可以为您的发行版找到一个具有二进制文件的存储库,否则您可能必须自己编译该模块。但是构建模块并不是很难做到的。
3dinfluence 2011年

21

在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>

知道这一点,却忘了它-好吧,再次出现服务器故障,所有这些人都在写这些很棒的东西。谢谢你的提示!

1
我在RHEL 7.2机器上尝试过此操作。添加<topology sockets='1' cores='4' threads='1'/>到我的xml中。virsh capabilities | grep topology显示<topology sockets='1' cores='6' threads='2'/>。严重:执行了一个操作kill -HUP nnnnn,其中nnnnn是我的libvirtd进程的PID。启动虚拟机。有效。+1!谢谢!...但是不要忘记用HUP信号或重启来踢libvirtd!
Mike S

4

自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>

2

在RHEL / CentOS 5.5(kvm> = 83-164.el5)中,kvm二进制文件也支持“ -smp N,cores = N”选项(程序包中有backport补丁)。但是,libvirt版本不支持域XML中的<topology>元素。一种解决方法是为/ usr / libexec / kvm创建一个包装器脚本,该脚本添加适当的选项,并在<emulator>元素而不是默认路径中指定该脚本。


1

值得注意的是,Ubuntu 10.4(Lucid)的libvirt版本为0.7.5,而对拓扑的支持是在0.7.6版本的libvirt中添加的。Ubuntu 10.10(Maverick)具有0.8.3 libvirt,因此无需包装就可以直接支持XML中的拓扑规范。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.