web-dev-qa-db-pt.com

Existem vantagens reais em atribuir mais "núcleos" ao VirtualBox?

Eu tenho um 2.8 quad core i7 com um VirtualBox. Eu tenho a opção de atribuir até 4 núcleos para uma máquina de convidado, mas eu só tenho feito dois. Quais são as vantagens/desvantagens de atribuir mais núcleos a um convidado? BTW, eu ainda sou capaz de jogar StarCraft 2 em configurações Ultra todo o caminho enquanto executando dois sistemas operacionais convidados (Win 7 e Ubuntu), e mesmo acontece com BFBC2 (meus testadores de estresse). Como o i7 reage a cargas irregulares nos núcleos?

40
Chad Harrison

Os núcleos "virtuais" atribuídos a um 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 designado 1 CPU

  • Máquina host executando 4 núcleos físicos
  • SO cliente dentro de VM atribuído 1 núcleo

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

Executar um sistema operacional convidado nessa configuração que carrega totalmente a CPU resultará em uma carga de CPU do sistema operacional host de aproximadamente 25% (um dos quatro núcleos carregados no host).

É claro que você ainda pode ter tarefas que consomem CPU em execução no seu 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
  • Cliente OS dentro de VM atribuído 4 núcleos

Nesse caso, você pode executar aplicativos multithread bem dimensionados no guest VM que pode fazer uso total de todas as 4 CPUs virtuais. O VirtualBox usará 4 núcleos físicos para processar tarefas agendadas dentro de 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 pergunta depende muito do que você gostaria de fazer. Em alguns casos, pode ser útil atribuir todos os núcleos a um VM ou até executar múltiplos VM tendo cada um o total de CPUs atribuído. Nesses casos, um 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 máquinas virtuais. Para evitar isso, você pode dedicar alguns núcleos a VMs específicas. Por exemplo, executar 2 VMs com 2 CPUs designadas em um nó de 4 núcleos pode ajudar a que cada VM receba 2 CPUs dedicadas (supondo que não haja carga imposta pelo sistema operacional 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 um VM que está ocioso (nenhum programa que exija muita CPU é executado), a carga imposta por este 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 carga irregular?

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 planejador tentou round-robin carregar todos os núcleos da CPU. Portanto, a execução de 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 suspensão profunda 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 serã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 na capacidade 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 rodar em 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 cargas irregulares 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 combinada da CPU do que o single-threading combinado com o aumento do clock.

62
SkyBeam

Não investiguei os manuais no site VB, mas suponho que alocar núcleos a uma máquina convidada permitiria que o sistema operacional convidado visse vários núcleos e, assim, permitisse que os aplicativos tirassem proveito desses núcleos extras a velocidade/potência/eficiência adicionadas, o mesmo que seria para o sistema operacional host.

0
Xantec