Máquinas virtuais em todos os hipervisores que eu conheço podem usar CPUs virtuais adicionais nas quais agendar encadeamentos de execução simultâneos adicionais.
É exatamente essa camada de abstração entre máquina física e máquina virtual que faz com que não funcione da maneira que você descreve. A VM não está ciente de quantos núcleos a máquina física possui. A VM não "vê" as CPUs físicas (ou núcleos) na máquina física. O hypervisor fornece à VM quantas CPUs virtuais, e o SO convidado usa essas CPUs virtuais para agendar threads simultâneos adicionais ... O número total de CPUs virtuais que o hypervisor entrega às máquinas virtuais pode até exceder o número de CPUs físicas / núcleos na máquina.
Dito de outra maneira, uma máquina virtual, quando atribuída a uma única vCPU, agenda seus encadeamentos como se tivesse apenas uma CPU. Não importa quantos núcleos existem na máquina física subjacente. (Embora seja interessante notar que a máquina física pode agendar esse segmento de VM em um núcleo físico para um quantum de segmento ou intervalo de tempo e executá-lo em um núcleo físico diferente na próxima vez em que estiver programado para executar. A máquina virtual possui No entanto, nenhuma idéia está acontecendo. Tudo o que sabemos é que ele pode agendar apenas um encadeamento de cada vez, um após o outro, porque ele possui apenas uma CPU virtual.)
E vamos ser muito claros sobre nossos termos aqui. Você atribui vCPUs ou CPUs virtuais a VMs, não a "núcleos". Núcleos (pelo qual eu suponho que você quer dizer unidades de processamento físico que compartilham um único soquete físico) não são iguais a vCPUs. Há uma camada de abstração entre eles. Se uma VM tiver apenas 1 vCPU atribuída a ela, poderá agendar apenas um encadeamento para execução por vez. É por isso que sua VM é executada mais rapidamente com 2 a 4 CPUs virtuais atribuídas, porque agora ela pode agendar mais de um thread para ser executado simultaneamente.
No entanto, existe definitivamente uma lei de retornos decrescentes aqui, pois um número excessivo de CPUs virtuais incorre em custos indiretos cada vez mais altos em coisas como sincronização etc.
Existem pequenas diferenças entre como os hypervisores Hyper-V e VMware agendam os encadeamentos de máquinas virtuais para execução, e eles diferem na abordagem da "assinatura excessiva" de recursos físicos, mas esse é um bom conceito geral para começar.
A quantidade de CPUs virtuais atribuídas é importante. O software em execução na VM não está ciente do fato de estar em uma VM e de que o host é capaz de mais do que o que a VM é apresentada. Portanto, se você estiver executando um software que possa tirar proveito de vários núcleos da CPU, em uma VM que tenha apenas um núcleo atribuído, o software agendará apenas um núcleo para suas tarefas, e a VM também usará apenas um núcleo do host em um tempo. Depois de fornecer à VM mais núcleos, o software pode agendar mais tarefas paralelas, que a CPU dos hosts agendará para a VM.
Cuidado para não exagerar nas VMs, para não causar contenda; se uma VM tiver mais núcleos virtuais do que o host, a VM estará lutando contra si mesma e, no caso de hipervisores programados por grupos, como vmware, a VM nunca será capaz de executar nada (a opção de globalizar é bloqueada pela camada de gerenciamento, é claro).
fonte