Para os serviços do Cloud Run, cada revisão é dimensionada automaticamente para o número de instâncias necessárias para processar todos os pedidos recebidos.
Quando mais instâncias estão a processar pedidos, é usada mais CPU e memória, o que resulta em custos mais elevados.
Para lhe dar mais controlo, o Cloud Run oferece uma definição de pedidos simultâneos máximos por instância que especifica o número máximo de pedidos que podem ser processados em simultâneo por uma determinada instância.
Máximo de pedidos simultâneos por instância
Pode configurar o número máximo de pedidos simultâneos por instância. Por predefinição, cada instância do Cloud Run pode receber até 80 pedidos em simultâneo. Pode aumentar este valor até um máximo de 1000.
Embora deva usar o valor predefinido, se necessário, pode diminuir a concorrência máxima. Por exemplo, se o seu código não conseguir processar pedidos paralelos, defina a simultaneidade como 1
.
O valor de simultaneidade especificado é um limite máximo. Se a CPU da instância já estiver a ser muito usada, o Cloud Run pode não enviar tantas solicitações a uma determinada instância. Nestes casos, a instância do Cloud Run pode mostrar que a concorrência máxima não está a ser usada. Por exemplo, se a utilização elevada da CPU for sustentada, o número de instâncias pode ser aumentado.
O diagrama seguinte mostra como a definição de pedidos em simultâneo máximos por instância afeta o número de instâncias necessárias para processar pedidos em simultâneo recebidos:
Ajustar a simultaneidade para a escala automática e a utilização de recursos
Ajustar a concorrência máxima por instância influencia significativamente a forma como o seu serviço é dimensionado e utiliza os recursos.
- Concorrência mais baixa: força o Cloud Run a usar mais instâncias para o mesmo volume de pedidos, porque cada instância processa menos pedidos. Isto pode melhorar a capacidade de resposta para aplicações que não estão otimizadas para um paralelismo interno elevado ou para aplicações que quer dimensionar mais rapidamente com base na carga de pedidos.
- Maior simultaneidade: permite que cada instância processe mais pedidos, o que pode levar a menos instâncias ativas e reduzir o custo. Isto é adequado para aplicações eficientes em tarefas paralelas associadas a E/S ou para aplicações que podem usar verdadeiramente várias vCPUs para o processamento de pedidos simultâneos.
Comece com a concorrência predefinida (80), monitorize o desempenho e a utilização da sua aplicação de perto e ajuste conforme necessário.
Concorrência com instâncias de várias vCPUs
A otimização da simultaneidade é especialmente crítica se o seu serviço usar várias vCPUs, mas a sua aplicação for de thread único ou efetivamente de thread único (limitada pela CPU).
- Pontos críticos de vCPU: uma aplicação de thread único numa instância com várias vCPUs pode atingir o limite máximo de uma vCPU enquanto as outras ficam inativas. O escalamento automático da CPU do Cloud Run mede a utilização média da CPU em todas as CPUs virtuais. A utilização média da CPU pode permanecer enganadoramente baixa neste cenário, o que impede um dimensionamento eficaz baseado na CPU.
- Usar a simultaneidade para impulsionar o escalamento: se o escalamento automático baseado na CPU for ineficaz devido a pontos críticos da vCPU, reduzir a simultaneidade máxima torna-se uma ferramenta importante. Os pontos críticos da vCPU ocorrem frequentemente quando a vCPU múltipla é escolhida para uma aplicação de thread único devido a necessidades elevadas de memória. A utilização da simultaneidade para impulsionar a escalabilidade força a escalabilidade com base no débito de pedidos. Isto garante que são iniciadas mais instâncias para processar a carga, o que reduz o tempo de espera e a latência por instância.
Quando limitar a simultaneidade máxima a um pedido de cada vez.
Pode limitar a simultaneidade para que apenas seja enviado um pedido de cada vez a cada instância em execução. Deve considerar fazê-lo nos casos em que:
- Cada pedido usa a maior parte da CPU ou da memória disponível.
- A sua imagem do contentor não foi concebida para processar vários pedidos ao mesmo tempo, por exemplo, se o seu contentor depender de um estado global que dois pedidos não podem partilhar.
Tenha em atenção que uma concorrência de 1
afeta provavelmente o desempenho da escalabilidade de forma negativa, porque muitas instâncias têm de ser iniciadas para processar um aumento acentuado nos pedidos recebidos. Consulte
Débito versus latência versus compromissos
para ver mais considerações.
Caso prático
As métricas seguintes mostram um exemplo de utilização em que 400 clientes estão a fazer 3 pedidos por segundo a um serviço do Cloud Run definido para um máximo de pedidos concorrentes por instância de 1. A linha superior verde mostra os pedidos ao longo do tempo e a linha inferior azul mostra o número de instâncias iniciadas para processar os pedidos.
As métricas seguintes mostram 400 clientes a fazer 3 pedidos por segundo a um serviço do Cloud Run definido para um máximo de pedidos simultâneos por instância de 80. A linha superior verde mostra os pedidos ao longo do tempo e a linha inferior azul mostra o número de instâncias iniciadas para processar os pedidos. Repare que são necessárias muito menos instâncias para processar o mesmo volume de pedidos.
Concorrência para implementações de código-fonte
Quando a simultaneidade está ativada, o Cloud Run não oferece isolamento entre pedidos simultâneos processados pela mesma instância. Nestes casos, tem de garantir que o seu código é seguro para execução em simultâneo. Pode alterar esta situação definindo um valor de simultaneidade diferente. Recomendamos que comece com uma concorrência mais baixa, como 8, e, em seguida, a aumente. Começar com uma concorrência demasiado elevada pode levar a um comportamento não intencional devido a restrições de recursos (como memória ou CPU).
Os tempos de execução de idiomas também podem afetar a simultaneidade. Alguns destes impactos específicos do idioma são apresentados na lista seguinte:
O Node.js é inerentemente de thread único. Para tirar partido da simultaneidade, use o estilo de código assíncrono do JavaScript, que é idiomático no Node.js. Consulte a secção Controlo de fluxo assíncrono na documentação oficial do Node.js para ver detalhes.
Para o Python 3.8 e posterior, o suporte de concorrência elevada por instância requer threads suficientes para processar a concorrência. Recomendamos que defina uma variável de ambiente de tempo de execução para que o valor de threads seja igual ao valor de simultaneidade, por exemplo:
THREADS=8
.
O que se segue?
Para gerir o número máximo de pedidos simultâneos por instância dos seus serviços do Cloud Run, consulte o artigo Definir o número máximo de pedidos simultâneos por instância.
Para otimizar a definição de pedidos simultâneos máximos por instância, consulte as sugestões de desenvolvimento para ajustar a simultaneidade.