Concentração de Requisições em Certos Processos

Fenômeno

Às vezes, ao executarmos o comando php start.php status, observamos que as requisições estão concentradas em certos processos específicos, enquanto os outros processos permanecem completamente ociosos.

Mecanismo de Preempção

O método padrão do Workerman para vários processos adquirirem conexões é preemptivo. Isso significa que, quando um cliente inicia uma conexão, todos os processos ociosos têm a oportunidade de pegar essa conexão, e o mais rápido vence. A definição de "rápido" é determinada pelo escalonamento do núcleo do sistema operacional. O sistema operacional pode priorizar a seleção do processo que foi usado mais recentemente para obter o uso da CPU, pois o contexto do processo anterior pode ainda estar contido nos registradores da CPU, o que pode reduzir o custo de troca de contexto. Portanto, quando a carga de trabalho é suficientemente rápida ou durante testes de estresse, é mais provável que as conexões sejam concentradas em alguns processos específicos, pois essa estratégia pode evitar trocas frequentes de processos, resultando em desempenho geralmente ótimo, não sendo um problema.

Mecanismo de Round Robin

O Workerman pode mudar o método de aquisição de conexões para round robin configurando $worker->reusePort = true;. Com este método, o núcleo fará uma distribuição quase uniforme das conexões para todos os processos, permitindo que todos os processos tratem as requisições simultaneamente.

Equívoco

Muitos desenvolvedores acreditam que quanto mais processos participarem do tratamento de requisições, melhor será o desempenho. Na verdade, isso pode não ser verdade. Quando a carga de trabalho é suficientemente simples, colocar o número de processos de tratamento de requisições o mais próximo possível do número de núcleos da CPU resulta em maior capacidade de throughput do servidor. Por exemplo, em um servidor de 4 núcleos, com o número de processos definido para 4, a taxa de QPS em um teste de "helloworld" geralmente é a mais alta. Se o número de processos participantes exceder excessivamente o número de núcleos da CPU, o custo de contexto dos processos aumentará, e o desempenho poderá piorar. Em geral, para aplicações que envolvem banco de dados, definir o número de processos para 3 a 6 vezes o número de núcleos da CPU pode resultar em um desempenho melhor.