¿Por qué aumentar el "Número de procesadores lógicos" para una VM alojada en Hyper-V aumenta el rendimiento de esa VM?

9

A mi entender, las máquinas virtuales (suponiendo que Relative Weightsean iguales) obtienen una parte igual del procesador.

Cuando a la VM se le da algo de tiempo de procesamiento, no debería importar si la VM está viendo un solo núcleo para usar o múltiples núcleos, ya que el procesamiento proviene de una serie de procesadores en el host Hyper-V independientemente. Sin embargo, cuando configuro la Number of logical processorsconfiguración de 1 a 4 en Hyper-V para una VM en particular, veo un gran aumento en el rendimiento.

Las especificaciones en mi configuración actual son aproximadamente:

  • El host Hyper-V tiene 32 GB de RAM, 24 procesadores lógicos (¿palabra incorrecta?), Algunos TB de espacio.

  • Las máquinas virtuales tienen asignados 6 GB de RAM, 1 o 4 núcleos, unos pocos cientos de GB de espacio y ejecutan 2008 R2.

He experimentado algo similar en configuraciones anteriores de Hyper-V.

Blackjack00
fuente

Respuestas:

20

Las máquinas virtuales en cada hipervisor que conozco pueden usar CPU virtuales adicionales en las que programar subprocesos concurrentes adicionales de ejecución.

Es exactamente esa capa de abstracción entre la máquina física y la máquina virtual que hace que no funcione de la manera que usted describe. La máquina virtual no sabe cuántos núcleos tiene la máquina física. La VM no "ve" las CPU físicas (o núcleos) en la máquina física. El hipervisor le da a la VM cuántas CPU virtuales, y el sistema operativo invitado usa esas CPU virtuales para programar subprocesos concurrentes adicionales ... El número total de CPU virtuales que el hipervisor entrega a las máquinas virtuales puede incluso superar el número de CPU físicas / núcleos en la máquina.

Dicho de otra manera, una máquina virtual, cuando se le asigna una única vCPU, programa sus subprocesos como si solo tuviera una CPU. No importa cuántos núcleos hay en la máquina física subyacente. (Aunque vale la pena señalar que la máquina física puede programar que un subproceso VM en un núcleo físico para una cantidad de subproceso, o segmento de tiempo, y luego ejecutarlo en un núcleo físico diferente la próxima vez que esté programado para ejecutarse. La máquina virtual tiene Sin embargo, no tengo idea de que eso suceda. Todo lo que sabe es que solo puede programar un hilo a la vez, uno tras otro, porque solo tiene una CPU virtual).

Y seamos muy claros acerca de nuestros términos aquí. Usted asigna vCPU o CPU virtuales a máquinas virtuales, no "núcleos". Los núcleos (por los cuales supongo que se refiere a unidades de procesamiento físico que comparten un solo socket físico) no son iguales a las vCPU. Hay una capa de abstracción entre ellos. Si una VM solo tiene 1 vCPU asignada, solo puede programar un subproceso para que se ejecute a la vez. Es por eso que su VM se ejecuta más rápido con 2 -4 CPU virtuales asignadas, porque ahora puede programar más de un hilo para que se ejecute simultáneamente.

Sin embargo, definitivamente hay una ley de rendimientos decrecientes aquí, ya que un número excesivo de CPU virtuales incurre en un costo general cada vez mayor en cosas como la sincronización, etc.

Existen ligeras diferencias entre la forma en que los hipervisores Hyper-V y VMware programan subprocesos de máquinas virtuales para su ejecución, y difieren en su enfoque para la "suscripción excesiva" de recursos físicos, pero este es un buen concepto general para comenzar.

Ryan Ries
fuente
77
@ Flapjack00 No ... eso es exactamente lo contrario de lo que acabo de decir. Y seamos muy claros acerca de nuestros términos aquí. Usted asigna vCPU o CPU virtuales a máquinas virtuales, no "núcleos". Los núcleos (por los cuales supongo que se refiere a unidades de procesamiento físico que comparten un solo socket) no son iguales a las vCPU. Hay una capa de abstracción entre ellos. Si una VM solo tiene 1 vCPU asignada, solo puede programar un subproceso para que se ejecute a la vez.
Ryan Ries
1
Ah! Entonces, en ese caso, una VM configurada con 4 vCPU podría programar 4 subprocesos a la vez. Suponiendo que mi host tenga suficientes vCPU disponibles, ¿esos 4 hilos podrían procesarse al mismo tiempo?
Blackjack00
1
@ Flapjack00 "Suponiendo que mi host tiene suficientes vCPU disponibles" : el host no tiene vCPU, la VM sí. El host tiene núcleos (o, más correctamente, procesadores lógicos; un solo núcleo puede tener múltiples procesadores lógicos, como Hyper-threading) a los que se asignan las vCPU.
BlueRaja
2
@ Dan, ese es un problema específico de VMware. No afecta a Hyper-V.
Jake Oshins
1
El "x vCpu requiere bloqueos Y cpu" que VMware tenía se eliminó en ESX 3.5, por lo que esto ya no se aplica a ningún hipervisor moderno. Dicho esto, debe tener cuidado de no asignar recursos innecesarios a sus máquinas virtuales, y las vCpu son especialmente importantes. Demasiados y perderás el rendimiento general.
pauska
3

La cantidad de CPU virtuales asignadas es importante. El software que se ejecuta en la VM no es consciente del hecho de que está en una VM y que el host es capaz de más de lo que se presenta la VM. Entonces, si está ejecutando un software que puede aprovechar múltiples núcleos de CPU, en una VM que solo tiene un núcleo asignado, el software solo programará un núcleo para sus tareas, y la VM también, solo usará un núcleo host en un momento. Una vez que le dé más núcleos a la VM, el software puede programar más tareas paralelas, que la CPU de los hosts programará para la VM.

Tenga cuidado de no dar demasiadas máquinas virtuales, para no causar contención, si una VM tiene más núcleos virtuales que el host, la VM competirá contra sí misma, y ​​en caso de hipervisores programados por pandillas, como vmware, la VM nunca podrá ejecutar nada en absoluto (la opción de sobreasignar está bloqueada por la capa de administración, por supuesto).

dyasny
fuente