Quando você está falando sobre desempenho em um servidor, existem algumas maneiras diferentes de analisá-lo. Há o tempo de resposta aparente (semelhante à latência da rede) e a taxa de transferência (semelhante à largura de banda da rede).
Algumas versões do Windows Server são fornecidas com as configurações de energia balanceada ativadas por padrão. Como Jeff apontou. O Windows 2008 R2 é um deles. Atualmente, muito poucas CPUs são de núcleo único; portanto, essa explicação se aplica a quase todos os servidores Windows em que você se depara, com exceção das VMs de núcleo único. (mais sobre isso depois).
Quando o plano de energia equilibrada está ativo, a CPU tenta reduzir a quantidade de energia que está usando. A maneira como faz isso é desabilitando metade dos núcleos da CPU em um processo conhecido como "estacionamento". Apenas metade das CPUs estará disponível por vez, portanto, consome menos energia durante períodos de pouco tráfego. Isso não é um problema por si só.
O que é um problema é o fato de que quando as CPUs não estão estacionadas, você duplicou os ciclos de CPU disponíveis para o sistema e desequilibrou repentinamente a carga no sistema, passando de (por exemplo) 70% de utilização para 35% de utilização. O sistema analisa isso e, após o processamento da explosão do tráfego, ele pensa: "Ei, eu devo ligar um pouco para economizar energia". E assim é.
Aqui está a parte ruim. A fim de evitar uma distribuição desigual de calor e energia nos núcleos da CPU, ele tende a estacionar as CPUs que não foram estacionadas recentemente. E para que isso funcione corretamente, a CPU precisa liberar tudo, desde os registros da CPU (cache L1, L2 e L3) até algum outro local (provavelmente a memória principal).
Como um exemplo hipotético, digamos que você tenha uma CPU de 8 núcleos com C1-C8.
- Ativo: C1, C3, C5, C7
- Estacionado: C2, C4, C6, C8
Quando isso acontece, todos eles se tornam ativos por algum período de tempo e, em seguida, o sistema os estacionará da seguinte maneira:
- Ativo: C2, C4, C6, C8
- Estacionado: C1, C3, C5, C7
Mas, ao fazer isso, há uma boa sobrecarga associada à liberação de todos os dados do cache L1-L3 para que isso aconteça, para que erros estranhos não ocorram nos programas que foram liberados do pipeline da CPU.
Provavelmente, existe um nome oficial para isso, mas eu gosto de explicar isso como uma surra de CPU. Basicamente, os processadores estão gastando mais tempo fazendo trabalhos ocupados movendo dados internamente do que atendendo a solicitações de trabalho.
Se você tiver algum tipo de aplicativo que precise de baixa latência para suas solicitações, precisará desativar as configurações de Energia Balanceada. Se você não tiver certeza se isso é um problema, faça o seguinte:
- Abra o "Gerenciador de tarefas"
- Clique na aba "Performance".
- Clique em "Abrir Monitor de Recursos"
- Selecione a aba "CPU"
- Olhe para o lado direito da janela nas várias CPUs.
Se você vir algum deles estacionado, notará que metade deles está estacionado a qualquer momento, todos serão acionados e a outra metade será estacionada. Alterna para frente e para trás. Assim, as CPUs do sistema estão se debatendo.
Máquinas virtuais: esse problema é ainda pior quando você está executando uma máquina virtual, porque há uma sobrecarga adicional do hipervisor. De um modo geral, para que uma VM seja executada, o hardware precisa ter um slot no tempo disponível para cada um dos núcleos a cada intervalo de tempo.
Se você possui um hardware com 16 núcleos, é possível executar VMs com mais de 16 núcleos totais, mas para cada divisão do tempo, apenas 16 CPUs virtuais serão elegíveis para esse intervalo de tempo e o hypervisor deve ajustar todos os núcleos para uma VM nessa fatia do tempo. Não pode ser espalhado por várias fatias de tempo. (Uma divisão do tempo é essencialmente um conjunto de ciclos de CPU X. Pode ser 1000 ou pode ser 100k ciclos)
Ex: hardware de 16 núcleos com 8 VMs. 6 possuem 4 CPUs virtuais (4C) e 2 possuem 8 CPUs virtuais (8C).
Timeslice 1: 4x4C Timeslice 2: 2x8C Timeslice 3: 2x4C + 1x8C Timeslice 4: 1x8C + 2x4C
O que o hipervisor não pode fazer é dividir metade da atribuição de uma fatia de tempo nas 4 primeiras CPUs de uma VM de 8 vCPU e, em seguida, na próxima fatia de tempo, dê o restante para as outras 4 vCPU dessa VM. É tudo ou nada dentro de um tempo.
Se você estiver usando o Hyper-V da Microsoft, as configurações de controle de energia poderão ser ativadas no sistema operacional host, o que significa que elas serão propagadas para os sistemas clientes, afetando-os também.
Depois de ver como isso funciona, é fácil ver como o uso das configurações do Balanced Power Control causa problemas de desempenho e servidores lentos. Um dos problemas subjacentes é que a solicitação de entrada precisa aguardar a conclusão do processo de estacionamento / desparqueamento da CPU antes que o servidor possa responder à solicitação de entrada, seja uma consulta ao banco de dados, uma solicitação do servidor da Web ou qualquer outra coisa .
Às vezes, o sistema estaciona ou desarma a CPU no meio de uma solicitação. Nesses casos, a solicitação inicia no pipeline da CPU, é despejada e, em seguida, um núcleo de CPU diferente inicia o processo a partir daí. Se for uma solicitação pesada o suficiente, isso pode acontecer várias vezes ao longo da solicitação, alterando o que deveria ter sido uma consulta ao banco de dados de 5 segundos para uma consulta ao banco de dados de 15 segundos.
A maior coisa que você verá ao usar o Balanced Power é que os sistemas parecerão mais lentos para responder a quase todos os pedidos que você fizer.