Este tópico descreve como otimizar cold starts para instâncias elásticas e melhorar o desempenho de funções no Function Compute ao definir um número mínimo de instâncias.
O que é um cold start?
Por padrão, o Function Compute utiliza instâncias elásticas. Essas instâncias realizam dimensionamento automático em resposta às requisições. Quando uma requisição chega, o sistema cria uma instância para processá-la. A instância é recuperada assim que deixa de processar requisições. O faturamento ocorre apenas durante o tempo em que as instâncias estão processando requisições. Embora esse modelo elástico simplifique o gerenciamento de recursos, ele pode causar problemas de desempenho, como cold starts e alta latência.
Um cold start é o processo de preparação do ambiente de execução e do seu código. Esse processo inclui baixe o código, iniciar o contêiner da instância da função, inicializar o runtime e inicializar seu código. Após a conclusão do cold start, a instância da função pode processar requisições.
Otimize cold starts
A otimização de cold starts é uma responsabilidade compartilhada entre o usuário e a plataforma. Embora o Function Compute inclua diversas otimizações no nível do sistema, você pode usar os métodos a seguir para reduzir ainda mais os tempos de cold start:
-
Simplifique os pacotes de código
Mantenha os pacotes de código o menor possível removendo dependências desnecessárias. Por exemplo, execute o comando npm prune no Node.js ou autoflake no Python. Além disso, algumas bibliotecas de terceiros podem conter arquivos não necessários para a execução, como source code de casos de teste, arquivos binários não utilizados ou arquivos de dados. Exclua esses arquivos não utilizados para reduzir o tempo necessário para baixe e descompactar seu código.
-
Escolha a linguagem de função adequada
O runtime Java geralmente apresenta um tempo de cold start maior do que outras linguagens devido a diferenças no design da linguagem. Para aplicações sensíveis à latência de cold start, utilize uma linguagem leve, como Python, para reduzir significativamente a latência de longa duração. Essa abordagem é especialmente eficaz se houver pouca diferença na latência de warm start entre as linguagens.
-
Defina um tamanho de memória apropriado
Uma configuração de memória maior aloca mais recursos de CPU para o mesmo nível de concorrência. Isso resulta em um melhor desempenho de cold start.
-
Reduza a probabilidade de cold starts
Utilize um handler Initializer. O Function Compute chama a interface de inicialização de forma assíncrona, o que separa o tempo de inicialização do código do tempo de execução da requisição. Como resultado, os cold starts não são perceptíveis durante atualizações do sistema do Function Compute ou atualizações de funções.
Modo misto
Alguns cold starts do lado do usuário são difíceis de eliminar. Por exemplo, a inferência de deep learning exige o carregamento de arquivos de modelos grandes. Outro exemplo é uma função que precisa interagir com um sistema legado usando um cliente com longo tempo de inicialização. Nesses cenários, se sua função for altamente sensível à latência, defina o número mínimo de instâncias como 1 ou mais. Quando uma requisição chegar, essas instâncias em hibernação poderão ser ativadas rapidamente para processar a requisição.
Quando o número mínimo de instâncias é definido como 1 ou mais, o sistema prioriza a atribuição de requisições a essas instâncias pré-aquecidas. Se as instâncias pré-aquecidas não conseguirem lidar com a carga de trabalho atual, o sistema criará automaticamente mais instâncias elásticas. Essa abordagem equilibra desempenho e utilização de recursos. Ao definir um número mínimo de instâncias, você pré-aloca recursos de computação para lidar com flutuações na carga de trabalho. O sistema continua usando as instâncias pré-aquecidas para processar requisições mesmo enquanto cria novas instâncias. Isso elimina a latência de cold start para requisições tratadas pelas instâncias pré-aquecidas.
Por exemplo, suponha que o número mínimo de instâncias de uma função esteja definido como 10. Se a carga de trabalho simultânea exigir mais de 10 instâncias, o sistema criará novas instâncias elásticas para lidar com as requisições adicionais. O fato de uma instância estar totalmente carregada depende da sua configuração de concorrência. O sistema rastreia o número de requisições sendo processadas em cada instância de função. Quando o número de requisições simultâneas em uma instância atinge seu limite configurado, o sistema encaminha novas requisições para outra instância disponível. Quando todas as instâncias disponíveis atingem seus limites de concorrência, uma nova instância é criada.
Se você definir o número mínimo de instâncias como 1 ou mais, será cobrado por essas instâncias mesmo quando elas não estiverem processando requisições. A cobrança baseia-se no preço unitário para instâncias elásticas em hibernação superficial. Para obter mais informações sobre faturamento, consulte Visão geral do faturamento. Para garantir que o uso de recursos permaneça dentro de um intervalo desejado, configure um número máximo de instâncias.