Processador do servidor
Manual de Requisitos
Manual de Requisitos
Neste tópico será apresentada uma sugestão de fórmula matemática para auxiliar na escolha do processador (back-end) (servidor como serviço do Windows, servidor Apache e Gerenciador de Tarefas).
Mas, de qualquer forma, ressaltamos a necessidade de usar uma máquina preparada para um possível upgrade de processador.
Abaixo um exemplo para atender a 300 threads (ou requisições do WK, porque cada requisição cria uma thread) simultâneas (que estão em execução ao mesmo tempo dentro). O resultado foi 16 processadores lógicos (arredondando), o que é atendido por 1 processador (chip físico) de 8 núcleos (cada núcleo dos processadores atuais tem 2 processadores lógicos):
N(p): Número de processadores lógicos que devemos ter na máquina;
2: Cada núcleo tem 2 processadores lógicos não simétricos. Se eu tenho 2 threads simultâneas, precisarei de 2 núcleos (sendo que cada núcleo tem 2 processadores lógicos) para executar de forma paralela real (sem "time slicing"). Aqui tentamos paralelizar ao máximo as threads (paralelismo real);
K(la): É o coeficiente que considera a média de carga (load average). Considerando ocupar só 70% do total dos processadores lógicos. 30% destinado às tarefas do SO e eventuais outros softwares instalados. Por exemplo, um processador com 2 núcleos e cada núcleo tem 2 processadores lógicos, então podemos executar 4 threads "em paralelo (com time slicing, ou seja, não é paralelismo real)", ocupando assim 100% dos processadores lógicos existentes num determinado momento do tempo. No exemplo acima o valor desse coeficiente é o resultado de: 1/0,7 (que arredondando dá 1.4). Sendo assim, no exemplo acima é adicionado 30% a mais de threads para que se tenha essa margem de sobra de processadores (30% a mais). Ou seja, se a necessidade for de 10 processadores, então multiplicamos por 1.4 para dizer que precisamos de 14 processadores. Logo, 4 processadores ficarão sobrando para o SO e outras coisas. Logo, as threads ocuparão somente 70% da carga total (somente 10 processadores);
K(el): É o "coeficiente efetivo de carga" que considera a carga efetiva do conjunto total de threads existentes simultaneamente (ou seja, quantas threads estarão efetivamente exigindo o esforço do processador em qualquer determinado momento). O servidor do WK que fica no Apache não tem estado, ou seja, uma requisição (que gera uma thread) é criada, processa tudo e é destruída. Considerando somente o servidor do WK que fica no Apache, meu coeficiente pode ser 1 (100%), que significa que uma thread de requisição do WK estará sempre executando e nunca em espera. Mas, no exemplo acima, supondo que somente 90% (0,9 da fórmula) das threads estarão de fato consumindo processador o tempo todo porque tenho as threads geradas pelas conexões do cliente Windows (que são minoria, porque o cliente HTML é o mais usado) ao servidor do WK que roda como um serviço do Windows (estas têm estado, ou seja, uma conexão é feita e fica aberta durante todo o tempo, exigindo processador somente quando há uma requisição de fato). Além disso, existem pontos na execução do código que pode fazer com que qualquer thread entre em modo de espera, por exemplo: Pode ser que algumas estejam aguardando conexão de banco de dados, aguardando resposta de disco, aguardando resposta de rede, aguardando entrada em seção crítica (LOCKs), etc. Para entender mais, esse artigo aqui pode ajudar: https://bitismyth.wordpress.com/2012/03/13/cpu-usage-e-load-average/;
K(ts): Para entender o significado desta parte da fórmula é necessária uma explicação mais longa, que contenha uma pequena introdução a arquitetura de processadores e como o sistema operacional os gerencia. Isso pode ser encontrado nos links mais abaixo. Mas, um bom número que deve atender a todos os casos é 0,02;
U(max): É a quantidade máxima de threads (ou requisições) que se espera que possam existir simultaneamente. Considerando que 1 dashboard que tem 5 indicadores, pode disparar 5 requisições simultâneas.
Links de apoio para melhor entendimento desta fórmula: