Para serviços do Cloud Run, cada revisão é escalonada automaticamente conforme o número de instâncias necessárias para processar todas as solicitações recebidas.
Quando mais instâncias estiverem processando solicitações, mais CPU e memória serão usadas, gerando custos maiores.
Para ter mais controle, o Cloud Run fornece uma configuração de solicitações simultâneas máximas por instância que especifica o número máximo de solicitações que podem ser processadas simultaneamente por uma determinada instância.
Máximo de solicitações simultâneas por instância
É possível configurar o máximo de solicitações simultâneas por instância. Por padrão, cada instância de contêiner do Cloud Run pode receber até 80 solicitações ao mesmo tempo. É possível aumentar esse limite até 1.000.
Embora seja necessário usar o valor padrão, é possível, se necessário,
diminuir a simultaneidade máxima. Por exemplo, se o código não puder processar solicitações paralelas, defina a simultaneidade como 1
.
O valor de simultaneidade especificado é um limite máximo. Se a CPU da instância já estiver com uso intenso, o Cloud Run talvez não envie tantas solicitações para uma determinada instância. Nesses casos, a instância do Cloud Run pode mostrar que a simultaneidade máxima não está sendo utilizada. Por exemplo, se o uso alto da CPU for mantido, o número de instâncias poderá ser escalonar verticalmente.
O diagrama a seguir mostra como a configuração do máximo de solicitações simultâneas por instância afeta o número de instâncias de contêiner necessárias para processar as solicitações simultâneas recebidas:
Como ajustar a simultaneidade para o escalonamento automático e a utilização de recursos
Ajustar a simultaneidade máxima por instância influencia significativamente como o serviço dimensiona e utiliza os recursos.
- Menor simultaneidade: força o Cloud Run a usar mais instâncias para o mesmo volume de solicitações, porque cada instância lida com menos solicitações. Isso pode melhorar a capacidade de resposta de aplicativos que não são otimizados para alto paralelismo interno ou que você quer dimensionar mais rapidamente com base na carga de solicitações.
- Sincronia mais alta: permite que cada instância processe mais solicitações, o que pode levar a menos instâncias ativas e reduzir custos. Isso é adequado para aplicativos eficientes em tarefas paralelas de E/S ou para aplicativos que podem realmente usar várias vCPUs para processamento de solicitações simultâneas.
Comece com a simultaneidade padrão (80), monitore de perto a performance e a utilização do aplicativo e ajuste conforme necessário.
Concorrência com instâncias de várias vCPUs
O ajuste da simultaneidade é especialmente importante se o serviço usa várias vCPUs, mas o aplicativo é de linha de execução única ou efetivamente de linha de execução única (limitado à CPU).
- Pontos de acesso da vCPU: um aplicativo de thread único em uma instância de várias vCPUs pode maximizar uma vCPU enquanto outras ficam inativas. O escalonador automático de CPU do Cloud Run mede a utilização média da CPU em todas as vCPUs. A utilização média da CPU pode permanecer enganosamente baixa nesse cenário, impedindo o escalonamento eficaz baseado na CPU.
- Usar a simultaneidade para impulsionar o escalonamento: se o escalonamento automático baseado em CPU for ineficaz devido a pontos de acesso da vCPU, reduzir a simultaneidade máxima se torna uma ferramenta importante. Os pontos de acesso da vCPU geralmente ocorrem quando a vCPU múltipla é escolhida para um aplicativo de linha única devido a altas necessidades de memória. O uso da simultaneidade para impulsionar o escalonamento força o escalonamento com base na taxa de solicitações. Isso garante que mais instâncias sejam iniciadas para processar a carga, reduzindo a fila e a latência por instância.
Quando limitar a simultaneidade máxima a uma solicitação por vez?
É possível limitar a simultaneidade para que apenas uma solicitação por vez seja enviada para cada instância em execução. Considere fazer isso nos casos em que:
- cada solicitação usa a maior parte da CPU ou memória disponível;
- sua imagem de contêiner não foi projetada para processar várias solicitações ao mesmo tempo, por exemplo, seu contêiner depende do estado global que duas solicitações não podem compartilhar.
Uma simultaneidade de 1
provavelmente terá impacto negativo sobre o desempenho do escalonamento,
já que muitas instâncias precisarão ser iniciadas para processar um
pico nas solicitações de entrada. Consulte
Compensações entre capacidade de processamento, latência e custo
para mais considerações.
Estudo de caso
As métricas a seguir mostram um caso de uso em que 400 clientes fazem três solicitações por segundo a um serviço do Cloud Run configurado com um número máximo de solicitações simultâneas por instância de um. A linha superior verde mostra as solicitações ao longo do tempo, a linha azul inferior mostra o número de instâncias iniciadas para lidar com as solicitações.
As métricas a seguir mostram 400 clientes fazendo três solicitações por segundo a um serviço do Cloud Run configurado com um máximo de solicitações simultâneas por instância de 80. A linha superior verde mostra as solicitações ao longo do tempo e a linha azul inferior mostra o número de instâncias iniciadas para processar as solicitações. Muito menos instâncias são necessárias para lidar com o mesmo volume de solicitações.
Execução simultânea de implantações de código-fonte
Quando a simultaneidade está ativada, o Cloud Run não fornece isolamento entre solicitações simultâneas processadas pela mesma instância. Nesses casos, é necessário garantir que o código seja seguro para execução simultânea. Para alterar isso, defina um valor de simultaneidade diferente. Recomendamos começar com uma simultaneidade menor, como 8, e depois aumentar. Começar com uma simultaneidade muito alta pode levar a um comportamento intencional devido a restrições de recursos, como memória ou CPU.
Os ambientes de execução de linguagem também podem afetar a simultaneidade. Alguns desses impactos específicos de linguagem são mostrados na lista a seguir:
O Node.js é inerentemente uma única linha de execução. Para aproveitar a simultaneidade, use o estilo de código assíncrono do JavaScript, que é idiomático no Node.js. Consulte Controle de fluxo assíncrono na documentação oficial do Node.js para mais detalhes.
Para o Python 3.8 e versões mais recentes, o suporte a alta simultaneidade por instância requer linhas de execução suficientes para processar a simultaneidade. Recomendamos que você defina uma variável de ambiente de execução para que o valor das linhas de execução seja igual ao valor de simultaneidade, por exemplo:
THREADS=8
A seguir
Para gerenciar o máximo de solicitações simultâneas por instância dos serviços do Cloud Run, consulte Como definir o máximo de solicitações simultâneas por instância.
Para otimizar a configuração máxima de solicitações simultâneas por instância, consulte dicas de desenvolvimento para ajustar a simultaneidade.