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.
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).
fuente