Por que o aumento do “Número de processadores lógicos” para uma VM hospedada no Hyper-V aumenta o desempenho dessa VM?

9

Para meu entendimento, as máquinas virtuais (supondo que Relative Weightsejam iguais) recebem uma parcela igual do processador.

Quando a VM recebe algum tempo de processamento, não importa se a VM está vendo um único núcleo para usar ou vários núcleos, pois o processamento sai de uma matriz de processadores no host Hyper-V, independentemente. No entanto, quando defino a Number of logical processorsconfiguração de 1 a 4 no Hyper-V para uma VM específica, vejo um enorme aumento de desempenho.

As especificações da minha configuração atual são aproximadamente:

  • O host Hyper-V possui 32 GB de RAM, 24 processadores lógicos (palavra errada?), Alguns TB de espaço.

  • As VMs são alocadas em 6 GB de RAM, 1 ou 4 núcleos, algumas centenas de GB de espaço e executando o 2008 R2.

Eu experimentei uma coisa semelhante em configurações anteriores do Hyper-V.

Blackjack00
fonte

Respostas:

20

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.

Ryan Ries
fonte
7
@ Flapjack00 Não ... esse é exatamente o oposto do que eu acabei de dizer. 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) 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.
Ryan Ries
1
Ah! Portanto, nesse caso, uma VM configurada com 4 vCPUs pode agendar 4 threads por vez. Supondo que meu host tenha vCPUs suficientes disponíveis, esses 4 threads podem ser processados ​​ao mesmo tempo?
Blackjack00
1
@ Flapjack00 "Supondo que meu host tenha vCPUs suficientes disponíveis" - O host não possui vCPU's, a VM possui. O host possui núcleos (ou, mais corretamente, processadores lógicos - um único núcleo pode ter vários processadores lógicos, como no Hyper-threading) aos quais as vCPUs são atribuídas.
BlueRaja
2
@ Dan, esse é um problema específico do VMware. Não afeta o Hyper-V.
21413 Jake Oshins
1
O "x vCpu exige bloqueios em Y cpu" que o VMware possuía foi removido no ESX 3.5; portanto, isso não se aplica mais a nenhum hipervisor moderno. Dito isto, você deve ter cuidado para não atribuir recursos desnecessários às suas VMs, e os vCpu's são especialmente importantes. Muitos deles e você perderá o desempenho geral.
24513 pauska
3

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

dyasny
fonte