¿Por qué mi máquina virtual Windows 7 que se ejecuta bajo KVM de Linux no usa todos los procesadores virtuales?

12

Todos

He tenido un problema en mi servidor desde que migré una de mis máquinas virtuales de Windows 2008 Server a Windows 7 (último): aunque he asignado cuatro núcleos a la máquina virtual e incluso parece verlos, parece pensar que tiene dos núcleos!

¡Reconoce mis procesadores pero no los usa!

¿Alguien puede decirme qué está pasando aquí? Pensé que podría haber sido una incompatibilidad entre KVM y Windows 7, pero desde que ve los procesadores virtuales, empiezo a pensar que no ... ¿alguna pista?

Aquí hay una captura de pantalla del administrador de procesos que muestra solo dos núcleos en el mismo cuadro:

Administrador de tareas

jkp
fuente
¿Estás seguro de que no te muestra dos procs de doble núcleo?
phoebus
@phoebus: Me pregunto eso, pero en todas las versiones de Windows donde ejecuté esta configuración antes de ver cuatro núcleos cuando busco en el monitor del procesador, lo cual no hago aquí.
jkp
Cuando dice monitor de procesador, ¿se refiere a la sección de monitoreo de rendimiento del administrador de tareas? Debido a que se basa únicamente en sus capturas de pantalla, está mostrando evidencia de dos procesadores de dos núcleos. Si ese es el caso, debería ver los 4 núcleos en el monitor de rendimiento. Si no lo hace, entonces sí, algo es inestable.
phoebus
@phoebus: sí, me refiero a la sección de supervisión del rendimiento del administrador de tareas. Definitivamente me parece
inestable

Respuestas:

17

Sospecho que los procesadores se presentan como procesadores de un solo núcleo en zócalos separados. Windows 7 ultimate admite hasta 2 sistemas de socket, por lo que utilizará 2 procesadores.

No sé si puede configurar KVM para presentar los procesadores como una CPU de cuatro núcleos o dos CPU de doble núcleo, lo que debería resolver el problema.

xenny
fuente
1
Eso es correcto. ATM no hay forma de cambiar la topología.
Luca Tettamanti
1
Wow, no sabía esto. Gracias por señalar correctamente el problema. @Luca: ¿sabes si ese apoyo está planeado? ¿De verdad estoy usando los dos núcleos adicionales o van a desperdiciar?
jkp
2
@Luca: en realidad desde qemu 0.12 puede cambiar la topología. He actualizado mis componentes kvm de espacio de usuario, pero creo que necesito el nuevo mod de kernel para que funcione ... de todos modos, se puede hacer :)
jkp
Ah, genial ... También debería actualizar también :)
Luca Tettamanti
Tenga en cuenta que puede ejecutar el módulo de kernel kvm más nuevo en su kernel anterior actual. Probablemente tendrá que compilar el módulo usted mismo a menos que pueda encontrar un repositorio para su distribución que tenga el binario para usted. Pero construir un módulo no es demasiado difícil de hacer.
3dinfluence
21

En libvirt 0.8.3, si escribe:

virsh capabilities | grep topology

enumerará la topología del host:

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

Los números se refieren a sockets, núcleos por socket e hilos por núcleo. Agregue esta línea a la entrada de la CPU en el archivo xml para permitir que Windows use los 4 núcleos, por ejemplo:

 <vcpu>4</vcpu>
 <cpu>
     <topology sockets='1' cores='4' threads='1'/>
 </cpu>
Mark Dayel
fuente
lo sabía, pero lo olvidé, bueno, de nuevo hay un defecto en el servidor y todas esas personas que escriben todas estas cosas increíbles. ¡gracias por el consejo!
fen
1
Probé esto en mi máquina RHEL 7.2. Agregado <topology sockets='1' cores='4' threads='1'/>a mi xml. virsh capabilities | grep topologymuestra <topology sockets='1' cores='6' threads='2'/>. CRÍTICO: kill -HUP nnnnnrealicé un donde nnnnn es el PID de mi proceso libvirtd. Comenzó la VM. Funcionó. +1! ¡Gracias! ... ¡Pero no olvides patear libvirtd con una señal HUP o un reinicio!
Mike S
4

La configuración de topología es totalmente compatible con virt-manager desde Ubuntu 15.04.

Desde virt-manager> CPU> Topología:

  • Comprobación: establecer manualmente la topología de la CPU
  • Zócalos: 2
  • Corazones: 2
  • Subprocesos: 2

Lo siguiente se crea a partir de la configuración anterior en virt-manager. No necesita ingresarlos con virsh edit.

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

La topología dejó de ser reconocida por Windows después de una actualización, y nuevamente limita las CPU virtuales a 2 sockets.

Para solucionar esto, use 'virsh edit' para ocultar la función kvm y agregue funciones de hiperv. Después de un apagado completo y reiniciar, la máquina virtual de Windows volverá a reconocer múltiples CPU.

¿Por qué mi máquina virtual Windows 7 que se ejecuta bajo KVM de Linux no usa todos los procesadores virtuales?

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

En RHEL / CentOS 5.5 (kvm> = 83-164.el5) el binario kvm también admite la opción "-smp N, cores = N" (hay parches de backport en el paquete); sin embargo, la versión libvirt no admite el elemento <topology> en el dominio XML. Una solución alternativa es crear un script de contenedor para / usr / libexec / kvm que agregue la opción adecuada y especifique ese script en el elemento <emulator> en lugar de la ruta predeterminada.

Sergey Vlasov
fuente
1

Vale la pena señalar que Ubuntu 10.4 (Lucid) tiene la versión 0.7.5 de libvirt, mientras que el soporte para la topología se agregó a libvirt en la versión 0.7.6. Ubuntu 10.10 (Maverick) tiene 0.8.3 libvirt y, por lo tanto, debería ser capaz de soportar directamente la especificación de topología en el XML sin un contenedor.

usuario67327
fuente