Por que minha VM do Windows 7 em execução no KVM do Linux não usa todos os processadores virtuais?

12

Todos

Eu tive um problema no meu servidor desde que migrei uma das minhas VMs do Windows 2008 Server para o Windows 7 (máximo): embora eu tenha atribuído quatro núcleos à VM e até pareça vê-los, parece pensar que tem dois núcleos!

Ele reconhece meus processadores, mas não os usa!

Alguém pode me dizer o que está acontecendo aqui? Eu pensei que poderia haver alguma incompatibilidade entre o KVM e o Windows 7, mas como ele vê os processadores virtuais, estou começando a pensar que não ... alguma pista?

Aqui está uma captura de tela do gerenciador de processos mostrando apenas dois núcleos na mesma caixa:

Gerenciador de tarefas

jkp
fonte
Tem certeza de que não está mostrando dois procs de núcleo duplo?
Phoebus
@ Phoebus: Eu me perguntei isso, mas em todas as versões do Windows em que executei essa instalação antes de ver quatro núcleos ao olhar no monitor do processador, o que não faço aqui.
jkp
Quando você diz monitor do processador, você quer dizer a seção de monitoramento de desempenho do gerenciador de tarefas? Como com base apenas nas capturas de tela, você está mostrando evidências de dois processadores de dois núcleos. Se for esse o caso, você deverá ver todos os 4 núcleos no monitor de desempenho. Se não, então sim, algo é instável.
Phoebus
Phoebus @: sim, quero dizer a seção de monitoramento de desempenho do gerenciador de tarefas. Definitivamente parece wonky para mim ...
jkp

Respostas:

17

Eu suspeito que os processadores estão sendo apresentados como processadores de núcleo único em soquetes separados. O Windows 7 Ultimate suporta até 2 sistemas de soquete, portanto, ele usa 2 processadores.

Não sei se você pode configurar o KVM para apresentar os processadores como uma única CPU quad core ou 2 CPUs dual core, o que deve resolver o problema.

xenny
fonte
1
Está correto. ATM: não há como alterar a topologia.
Luca Tettamanti
1
Uau, eu não sabia disso. Obrigado por colocar o dedo corretamente sobre o problema. @Luca: você sabe se esse apoio está planejado? Eu estou realmente usando os dois núcleos extras ou eles vão desperdiçar?
jkp
2
@Luca: na verdade, desde o qemu 0.12, você pode alterar a topologia. Eu atualizei meus componentes KVM espaço de usuário, mas eu acho que preciso do novo mod do kernel para que ele funcione .... de qualquer maneira, isso pode ser feito :)
jkp
Ah, legal ... eu deveria atualizar também, então :)
Luca Tettamanti
Lembre-se de que você pode executar o mais novo módulo kvm do kernel no seu kernel antigo atual. Você provavelmente precisará compilar o módulo, a menos que possa encontrar um repositório para sua distribuição que tenha o binário para você. Mas construir um módulo não é muito difícil de fazer.
3dinfluence
21

Na libvirt 0.8.3, se você digitar:

virsh capabilities | grep topology

listará a topologia do host:

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

Os números referem-se a soquetes, núcleos por soquete e threads por núcleo. Adicione esta linha à entrada da CPU no arquivo xml para permitir que o Windows use todos os 4 núcleos, por exemplo:

 <vcpu>4</vcpu>
 <cpu>
     <topology sockets='1' cores='4' threads='1'/>
 </cpu>
Mark Dayel
fonte
sabia, mas esquecia - bem, novamente, há uma falha no servidor e todas aquelas pessoas que escrevem todas essas coisas incríveis. Obrigado pela dica!
fen
1
Eu tentei isso na minha máquina RHEL 7.2. Adicionado <topology sockets='1' cores='4' threads='1'/>ao meu xml. virsh capabilities | grep topologymostra <topology sockets='1' cores='6' threads='2'/>. CRÍTICO: executei um em kill -HUP nnnnnque nnnnn é o PID do meu processo libvirtd. Iniciou a VM. Funcionou. +1! Obrigado! ... Mas não esqueça de chutar a libvirtd com um sinal HUP ou uma reinicialização!
Mike S
4

As configurações de topologia são totalmente suportadas no virt-manager desde o Ubuntu 15.04.

Do virt-manager> CPUs> Topologia:

  • Verificação: definir manualmente a topologia da CPU
  • Soquetes: 2
  • Cores: 2
  • Tópicos: 2

O seguinte é criado a partir das configurações acima no virt-manager. Você não precisa inseri-los com o virsh edit.

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

A topologia deixou de ser reconhecida pelo Windows após uma atualização e limita novamente a CPU virtual a 2 soquetes.

Para corrigir isso, use 'virsh edit' para ocultar o recurso kvm e adicione recursos hyperv. Após um desligamento completo e a reinicialização, a VM do Windows reconhecerá novamente várias CPUs.

Por que minha VM do Windows 7 em execução no KVM do Linux não usa todos os processadores virtuais?

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

No RHEL / CentOS 5.5 (kvm> = 83-164.el5), o binário kvm também suporta a opção "-smp N, cores = N" (existem patches de backport no pacote); no entanto, a versão libvirt não suporta o elemento <topology> no XML do domínio. Uma solução alternativa é criar um script de wrapper para / usr / libexec / kvm que inclua a opção apropriada e especifique esse script no elemento <emulator> em vez do caminho padrão.

Sergey Vlasov
fonte
1

Vale ressaltar que o Ubuntu 10.4 (Lucid) possui a versão 0.7.5 da libvirt enquanto o suporte à topologia foi adicionado à libvirt na versão 0.7.6. O Ubuntu 10.10 (Maverick) possui 0.8.3 libvirt e, portanto, deve suportar diretamente a especificação de topologia no XML sem um wrapper.

user67327
fonte