Os núcleos "virtuais" atribuídos a uma VM estão disponíveis para uso em multiprocessamento no sistema operacional cliente. Se você atribuir apenas um núcleo a uma VM, não haverá chance de o sistema operacional convidado distribuir a carga entre vários núcleos. Então, vamos supor alguns cenários práticos:
Host com 4 CPUs, convidado com 1 CPU
- Máquina host executando 4 núcleos físicos
- O sistema operacional cliente no VM atribuído 1 núcleo
Nesse caso, o sistema operacional convidado poderá usar apenas um núcleo. Portanto, se você executar um aplicativo multi-threaded que escala bem em vários núcleos, ele ainda será executado em apenas 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 nessa configuração, que carrega totalmente a CPU, resultará em uma carga de CPU do SO host de ~ 25% (um dos quatro núcleos carregados no host).
É claro que você ainda pode ter tarefas que consomem CPU em execução no sistema operacional host e usar os 3 núcleos restantes.
Host com 4 CPUs, convidado atribuído a 4 CPUs
- Máquina host executando 4 núcleos físicos
- O sistema operacional cliente dentro da VM atribuiu 4 núcleos
Neste caso, você pode executar aplicativos multithread bem dimensionados dentro da VM guest, que pode fazer uso total de todas as 4 CPUs virtuais. O VirtualBox usará 4 núcleos físicos para processar tarefas agendadas dentro da VM e, portanto, a carga da CPU do host pode atingir um máximo de 100% de uso.
Então, qual configuração você deveria escolher?
A resposta a esta questão 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, tendo cada uma a quantidade total de CPUs atribuída. Nesses casos, uma VM pode fazer uso total de todo o poder de processamento do host. Se mais CPUs forem atribuídas a VMs do que as físicas presentes, as VMs serão afetadas 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 designadas em um nó de 4 núcleos pode ajudar cada VM a obter 2 CPUs dedicadas (supondo que não haja carga imposta pelo sistema operacional do host, que também toma parte da capacidade de processamento).
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 que esteja inativa (nenhum programa que exija uso da CPU), a carga imposta por essa VM estará próxima de 0%. Você pode até executar 10 VMs em paralelo e ainda ter uma carga de CPU de host próxima a 0% se todas as VMs estiverem ociosas.
Como a CPU se comporta em cargas irregulares?
Bem, a distribuição de carga da CPU depende muito de um componente interno específico do sistema operacional chamado agendador. Para o Windows XP, o agendador tentou rodar o carregamento de todos os núcleos da CPU. Portanto, executar uma tarefa de encadeamento único com carga total em uma CPU de quatro núcleos renderia uma carga de aproximadamente 25% em cada núcleo. Infelizmente isso provou ser ruim para o gerenciamento de energia da CPU moderna. Para sistemas modernos, é até mesmo uma vantagem se um único núcleo for carregado até 100% antes que o segundo núcleo seja envolvido. A razão é que, enquanto não houver 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 mais novo AMD (Bulldozer), isso é ainda mais interessante, pois no caso de apenas um subconjunto dos núcleos ser usado, os não utilizados são desligados. Isso reduz o consumo de energia da CPU. Ambas (Intel e AMD) começam a usar o orçamento de consumo de energia e térmico para fazer o overclock dos núcleos que estão ativos. Portanto, isso pode dar aos aplicativos de encadeamento único (que não podem ser distribuídos a vários núcleos para trabalhar em uma tarefa em paralelo) um aumento. No entanto, quando todos os núcleos estão ativos, a maioria dessas tecnologias "boost" tem apenas um pequeno efeito no poder de processamento, já que a situação "all cores active" é exatamente a situação para a qual a CPU foi projetada. Mas quando você desliga alguns núcleos, os núcleos restantes podem executar overclock sem fazer com que o chip fique mais quente (ou consumindo mais energia) do que no caso de todos os núcleos estarem ativos.
Portanto, a resposta é que o seu Core i7 lida muito bem com a carga desigual em núcleos únicos e pode até mesmo fornecer um aumento de desempenho para aplicativos single-threaded. No entanto, esse aumento está dentro do intervalo de alguns por cento, enquanto aplicativos realmente multiencadeados que podem distribuir a carga entre vários núcleos de CPU podem ser impulsionados por fatores (x2 em dual-core, 4x em quad-core ...) no caso ideal . Portanto, o multi-threading está sempre fornecendo mais potência em termos de potência de CPU combinada do que o single-threading combinado com o aumento do clock.