Os núcleos "virtuais" que você atribui a uma VM estão disponíveis para uso no multiprocessamento no sistema operacional do cliente. Se você atribuir apenas um núcleo a uma VM, não haverá chance do sistema operacional distribuir a carga entre vários núcleos. Então, vamos assumir alguns cenários práticos:
Host com 4 CPUs, convidado atribuído 1 CPU
- Máquina host executando 4 núcleos físicos
- O SO do cliente na VM atribuiu 1 núcleo
Nesse caso, o sistema operacional convidado poderá usar apenas um núcleo. Portanto, se você executar um aplicativo multiencadeado que dimensione bem em vários núcleos, ele continuará sendo executado apenas em um núcleo. Portanto, todos os threads no sistema operacional convidado precisam compartilhar um núcleo físico.
A execução de um sistema operacional convidado nesta configuração que carrega totalmente a CPU gera uma carga de CPU do SO host de ~ 25% (um em cada quatro núcleos carregados no host).
É claro que você ainda pode ter tarefas que consomem CPU em execução no sistema operacional host e fazer uso dos 3 núcleos restantes.
Host com 4 CPUs, convidado com 4 CPUs
- Máquina host executando 4 núcleos físicos
- O SO do cliente na VM atribuiu 4 núcleos
Nesse caso, você pode executar aplicativos multithread bem dimensionados na VM convidada, que pode fazer uso total de todas as 4 CPUs virtuais. O VirtualBox usará quatro núcleos físicos para processar tarefas agendadas na VM e, portanto, a carga da CPU do host poderá atingir um máximo de 100% de uso.
Então, qual configuração você deve escolher?
A resposta a esta pergunta depende muito do que você gostaria de fazer. Em alguns casos, pode ser útil atribuir todos os núcleos a uma VM ou até executar várias VMs, cada uma com a quantidade total de CPUs atribuídas. Nesses casos, uma VM pode fazer uso total de todo o poder de processamento do host. Se mais CPUs forem atribuídas às VMs do que o físico presente, as VMs serão impactadas pela carga em diferentes VMs. Para evitar isso, você pode dedicar alguns núcleos a VMs específicas. Por exemplo, a execução de 2 VMs com 2 CPUs atribuídas cada um em um nó de 4 núcleos pode ajudar a cada VM obter 2 CPUs dedicadas (supondo que não haja carga imposta pelo SO host que também faz parte do poder de processamento).
Isso tem impacto negativo no meu host para atribuir todos os núcleos a uma VM?
Novamente, isso depende da execução do software. Se você executar uma VM inativa (nenhum programa que consome muita CPU), a carga imposta por essa VM será próxima de 0%. Você pode até executar 10 VMs em paralelo e ainda experimentar uma carga de CPU host de quase 0% se todas as VMs estiverem ociosas.
Como a CPU se comporta com carga desigual?
Bem, a distribuição de carga da CPU depende muito de um componente interno específico do SO chamado agendador. Para o Windows XP, o agendador tentou carregar alternadamente todos os núcleos da CPU. Portanto, executar uma tarefa de thread único com carga total em uma CPU de quatro núcleos renderia ~ 25% de carga em cada núcleo.
Infelizmente, isso provou ser ruim para o gerenciamento moderno de energia da CPU. Para sistemas modernos, é ainda uma vantagem se um único núcleo for carregado até 100% antes que o segundo núcleo seja envolvido. O motivo é que, desde que não haja carga suficiente para usar totalmente um núcleo, os outros núcleos podem permanecer no modo de sono profundo para economizar energia e reduzir a dissipação de calor.
Para alguns processadores, como o Intel Core i-Series e o AMD (Bulldozer) mais recente, isso é ainda mais interessante, pois no caso de apenas um subconjunto dos núcleos ser usado, os não utilizados são desativados. Isso reduz o consumo de energia da CPU. Ambos (Intel e AMD) começam a usar o orçamento de consumo térmico e de energia e depois fazem o overclock dos núcleos ativos. Portanto, isso pode impulsionar aplicativos de thread único (que não podem ser distribuídos para vários núcleos para trabalhar em uma tarefa em paralelo). No entanto, quando todos os núcleos estão ativos, a maioria dessas tecnologias "boost" tem apenas um pequeno efeito no poder de processamento, pois a situação "todos os núcleos ativos" é exatamente a situação para a qual a CPU foi projetada.
Portanto, a resposta é que o core i7 lida muito bem com cargas irregulares em núcleos únicos e pode até proporcionar um aumento de desempenho para aplicativos de thread único. No entanto, esse aumento está dentro da faixa de alguns por cento, enquanto os aplicativos de vários segmentos que podem distribuir a carga por vários núcleos da CPU podem ser aumentados por fatores (x2 no núcleo duplo, 4x no núcleo quádruplo ...) no melhor caso . Portanto, o multithreading sempre fornece mais energia em termos de energia combinada da CPU do que o single-threading combinado com o aumento do clock.
Não mergulhei nos manuais do site do VB, mas presumiria que a alocação de núcleos em uma máquina convidada permitiria que o sistema operacional convidado visse vários núcleos e, portanto, aplicativos que podem tirar proveito desses núcleos extras com a velocidade / energia / eficiência, como seria para o sistema operacional host.
fonte