Pourquoi ma machine virtuelle Windows 7 exécutée sous KVM Linux n'utilise-t-elle pas tous les processeurs virtuels?

12

Tout

J'ai eu un problème sur mon serveur depuis que j'ai migré une de mes machines virtuelles de Windows 2008 Server vers Windows 7 (ultime): bien que j'aie assigné quatre cœurs à la machine virtuelle et il semble même les voir, il semble le penser a deux cœurs!

Il reconnaît mes processeurs mais ne les utilise pas!

Quelqu'un peut-il me dire ce qui se passe ici? Je pensais que cela aurait pu être une incompatibilité entre KVM et Windows 7 mais comme il voit les processeurs virtuels, je commence à penser que non ... des indices?

Voici une capture d'écran du gestionnaire de processus montrant seulement deux cœurs sur la même boîte:

Gestionnaire des tâches

jkp
la source
Êtes-vous sûr qu'il ne vous montre pas deux procs dual-core?
phoebus
@phoebus: Je me suis posé la question, mais sur toutes les versions de Windows où j'ai exécuté cette configuration avant de voir quatre cœurs lorsque je regarde le moniteur du processeur, ce que je n'ai pas ici.
jkp
Quand vous dites moniteur processeur, voulez-vous dire la section de surveillance des performances du gestionnaire de tâches? Parce que basé uniquement sur vos captures d'écran, vous montrez des preuves de deux processeurs à deux cœurs. Si tel est le cas, vous devriez voir les 4 cœurs dans le moniteur de performances. Si vous ne le faites pas, alors oui, quelque chose est ridicule.
phoebus
@phoebus: oui, je veux dire la section de surveillance des performances du gestionnaire de tâches.
Cela

Réponses:

17

Je soupçonne que les processeurs sont présentés comme des processeurs monocœur dans des sockets séparés. Windows 7 Ultimate prend en charge jusqu'à 2 systèmes de socket, il utilisera donc 2 processeurs.

Je ne sais pas si vous pouvez configurer KVM pour présenter les processeurs comme un processeur quad core unique ou 2 processeurs dual core, ce qui devrait résoudre le problème.

xenny
la source
1
C'est correct. ATM, il n'y a aucun moyen de changer la topologie.
Luca Tettamanti
1
Wow, je ne savais pas ça. Merci d'avoir correctement mis le doigt sur le problème. @Luca: savez-vous si un tel soutien est prévu? Suis-je en train d'utiliser les deux cœurs supplémentaires ou vont-ils être gaspillés?
jkp
2
@Luca: en fait depuis qemu 0.12, vous pouvez changer la topologie. J'ai mis à niveau les composants kvm de mon espace utilisateur, mais je pense que j'ai besoin du nouveau mod du noyau pour que cela fonctionne .... de toute façon, cela peut être fait :)
jkp
Ah, cool ... Je devrais aussi mettre à jour alors :)
Luca Tettamanti
Gardez à l'esprit que vous pouvez exécuter le module de noyau kvm le plus récent sur votre ancien noyau actuel. Vous devrez probablement compiler le module vous-même, sauf si vous pouvez trouver un référentiel pour votre distribution qui a le binaire pour vous. Mais construire un module n'est pas trop difficile à faire.
3dinfluence
21

Sur libvirt 0.8.3, si vous tapez:

virsh capabilities | grep topology

il listera la topologie de l'hôte:

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

Les nombres font référence aux sockets, aux cœurs par socket et aux threads par noyau. Ajoutez cette ligne à l'entrée cpu dans le fichier xml pour permettre à Windows d'utiliser les 4 cœurs, par exemple:

 <vcpu>4</vcpu>
 <cpu>
     <topology sockets='1' cores='4' threads='1'/>
 </cpu>
Mark Dayel
la source
Je le savais, mais je l'ai oublié - eh bien, il y a encore une erreur de serveur et toutes ces personnes écrivant toutes ces choses géniales. Merci pour le conseil!
fen
1
J'ai essayé cela sur ma machine RHEL 7.2. Ajouté <topology sockets='1' cores='4' threads='1'/>à mon xml. virsh capabilities | grep topologymontre <topology sockets='1' cores='6' threads='2'/>. CRITIQUE: effectué un kill -HUP nnnnnoù nnnnn est le PID de mon processus libvirtd. Démarré la VM. Ça a marché. +1! Merci! ... Mais n'oubliez pas de lancer libvirtd avec un signal HUP ou un redémarrage!
Mike S
4

Les paramètres de topologie sont entièrement pris en charge dans virt-manager depuis Ubuntu 15.04.

Depuis virt-manager> CPU> Topologie:

  • Vérifier: définir manuellement la topologie du processeur
  • Prises: 2
  • Noyaux: 2
  • Fils: 2

Ce qui suit est créé à partir des paramètres ci-dessus dans virt-manager. Vous n'avez pas besoin de les saisir avec virsh edit.

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

La topologie a cessé d'être reconnue par Windows après une mise à jour et limite à nouveau les CPU virtuels à 2 sockets.

Pour résoudre ce problème, utilisez «virsh edit» pour masquer la fonctionnalité kvm et ajoutez des fonctionnalités d'hyperv. Après un arrêt complet et un redémarrage, la machine virtuelle Windows reconnaîtra à nouveau plusieurs processeurs.

Pourquoi ma machine virtuelle Windows 7 exécutée sous KVM Linux n'utilise-t-elle pas tous les processeurs virtuels?

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

Dans RHEL / CentOS 5.5 (kvm> = 83-164.el5), le binaire kvm prend également en charge l'option "-smp N, cores = N" (il y a des correctifs de rétroportage dans le package); cependant, la version libvirt ne prend pas en charge l'élément <topology> dans le domaine XML. Une solution consiste à créer un script d'encapsuleur pour / usr / libexec / kvm qui ajoute l'option appropriée et spécifie ce script dans l'élément <emulator> au lieu du chemin par défaut.

Sergey Vlasov
la source
1

Il convient de noter que Ubuntu 10.4 (Lucid) a la version 0.7.5 de libvirt tandis que la prise en charge de la topologie a été ajoutée à libvirt dans la version 0.7.6. Ubuntu 10.10 (Maverick) a la libvirt 0.8.3 et devrait donc être capable de supporter directement la spécification de topologie dans le XML sans wrapper.

user67327
la source