Perché la mia macchina virtuale Windows 7 in esecuzione su KVM di Linux non utilizza tutti i processori virtuali?


12

Tutti

Ho avuto un problema sul mio server da quando ho migrato una delle mie VM da Windows 2008 Server a Windows 7 (ultimo): sebbene abbia assegnato quattro core alla VM e sembra addirittura vederli, sembra pensarlo ha due core!

Riconosce i miei processori ma non li usa!

Qualcuno può dirmi cosa sta succedendo qui? Ho pensato che avrebbe potuto essere una certa incompatibilità tra KVM e Windows 7, ma dal momento che vede i processori virtuali sto iniziando a pensare di no ... qualche indizio?

Ecco uno screenshot di Process Manager che mostra solo due core nella stessa scatola:

Task Manager


Sei sicuro che non ti mostri due proc dual-core?
phoebus l'

@phoebus: me lo sono chiesto, ma poi su tutte le versioni di Windows in cui ho eseguito questa configurazione prima di vedere quattro core quando guardo nel monitor del processore, cosa che non trovo qui.
jkp,

Quando dici monitor del processore, intendi la sezione di monitoraggio delle prestazioni di Task Manager? Perché basato esclusivamente sui tuoi screenshot, stai mostrando prove di due processori a due core. In tal caso, dovresti vedere tutti e 4 i core nel monitor delle prestazioni. Se non lo fai, allora sì, qualcosa è traballante.
phoebus l'

@phoebus: sì, intendo la sezione di monitoraggio delle prestazioni del task manager. Sicuramente mi sembra traballante ...
jkp,

Risposte:


17

Sospetto che i processori vengano presentati come processori single core in socket separati. Windows 7 ultimate supporta fino a 2 sistemi socket, quindi utilizzerà 2 processori.

Non so se è possibile configurare KVM per presentare i processori come una singola CPU quad core o 2 CPU dual core, il che dovrebbe risolvere il problema.


1
È corretto. ATM non c'è modo di cambiare la topologia.
Luca Tettamanti,

1
Wow, non lo sapevo. Grazie per aver messo correttamente il dito sul problema. @Luca: sai se è previsto tale supporto? In realtà sto usando i due core in più o stanno andando a perdere?
jkp,

2
@Luca: in realtà da qemu 0.12 è possibile modificare la topologia. Ho aggiornato i componenti kvm del mio spazio utente ma penso di aver bisogno della nuova mod del kernel per farlo funzionare .... comunque, può essere fatto :)
jkp,

Ah, bello ... Dovrei aggiornare anche io :)
Luca Tettamanti,

Tieni presente che puoi eseguire il modulo kernel kvm più recente sul tuo attuale kernel precedente. Probabilmente dovrai compilare il modulo tu stesso a meno che tu non riesca a trovare un repository per la tua distribuzione che abbia il binario per te. Ma costruire un modulo non è troppo difficile da fare.
3dinfluenza

21

Su libvirt 0.8.3, se si digita:

virsh capabilities | grep topology

elencherà la topologia dell'host:

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

I numeri si riferiscono a socket, core per socket e thread per core. Aggiungi questa riga alla voce cpu nel file xml per consentire a Windows di utilizzare tutti e 4 i core, ad esempio:

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

lo sapevo, ma se ne dimenticava - beh, poi c'è di nuovo serverfault e tutte quelle persone che scrivono tutte queste cose fantastiche. grazie per il consiglio!
fen

1
Ho provato questo sulla mia macchina RHEL 7.2. Aggiunto <topology sockets='1' cores='4' threads='1'/>al mio XML. virsh capabilities | grep topologyspettacoli <topology sockets='1' cores='6' threads='2'/>. CRITICO: eseguito un kill -HUP nnnnndove nnnnn è il PID del mio processo libvirtd. Avviata la VM. Ha funzionato. +1! Grazie! ... Ma non dimenticare di calciare libvirtd con un segnale HUP o un riavvio!
Mike S,

4

Le impostazioni della topologia sono completamente supportate in virt-manager da Ubuntu 15.04.

Da virt-manager> CPU> Topologia:

  • Verifica: imposta manualmente la topologia della CPU
  • Prese: 2
  • Core: 2
  • Discussioni: 2

Quanto segue viene creato dalle impostazioni sopra in virt-manager. Non è necessario inserirli con virsh edit.

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

La topologia ha smesso di essere riconosciuta da Windows dopo un aggiornamento e limita nuovamente la CPU virtuale a 2 socket.

Per risolvere questo problema, usa 'virsh edit' per nascondere la funzione kvm e aggiungi le funzioni hyperv. Dopo uno spegnimento completo e il riavvio, la VM di Windows riconoscerà nuovamente più CPU.

Perché la mia macchina virtuale Windows 7 in esecuzione su KVM di Linux non utilizza tutti i processori virtuali?

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

2

In RHEL / CentOS 5.5 (kvm> = 83-164.el5) il binario kvm supporta anche l'opzione "-smp N, cores = N" (ci sono patch di backport nel pacchetto); tuttavia, la versione di libvirt non supporta l'elemento <topology> nel dominio XML. Una soluzione alternativa consiste nel creare uno script wrapper per / usr / libexec / kvm che aggiunge l'opzione appropriata e specifica quello script nell'elemento <emulatore> invece del percorso predefinito.


1

Vale la pena notare che Ubuntu 10.4 (Lucid) ha la versione 0.7.5 di libvirt mentre il supporto per la topologia è stato aggiunto a libvirt nella versione 0.7.6. Ubuntu 10.10 (Maverick) ha libvirt 0.8.3 e quindi dovrebbe essere in grado di supportare direttamente la specifica della topologia nell'XML senza un wrapper.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.