Conceitos da criação de perfil

A criação de perfil é uma análise de códigos dinâmica. Você captura as características do aplicativo enquanto ele é executado e usa essas informações para saber como tornar seu aplicativo mais rápido e eficiente.

Antes, a criação de perfil era realizada apenas durante o desenvolvimento do aplicativo. Essa abordagem dependia da capacidade de desenvolver testes de carga e comparativos de mercado que pudessem prever com precisão um ambiente de produção.

A criação contínua de perfil refere-se à criação de perfil do aplicativo enquanto ele é executado em um ambiente de produção. Essa abordagem reduz a necessidade de desenvolver testes de carga preditivos precisos e comparativos de mercado para o ambiente de produção. A pesquisa sobre criação de perfil contínua mostrou que ela é precisa e econômica *.

O Cloud Profiler é uma ferramenta de criação de perfil contínua projetada para aplicativos em execução no Google Cloud:

  • É um criador de perfil estatístico ou de amostragem que tem sobrecarga extremamente baixa e é adequado para ambientes de produção.

  • Ele é compatível com linguagens comuns e coleta vários tipos de perfil. Veja Tipos de criação de perfil disponíveis para ter uma visão geral.

Configurar um aplicativo do Google Cloud para gerar dados de perfil é um processo simples e único: vincule ou execute seu serviço com um agente de criação de perfil incluído. Depois que o aplicativo for implantado, o agente de criação de perfil será executado periodicamente para coletar dados de desempenho e depois enviar esses dados para o projeto do Google Cloud. Veja detalhes sobre esse processo em Coleta de perfis.

Depois de coletar dados de perfil para seu aplicativo, você pode analisá-los usando a interface do Profiler. A análise de dados de perfil normalmente é um processo iterativo que depende do seu conhecimento do design do aplicativo e da linguagem de programação dele.

*Veja Criação de perfil em todo o Google: uma infraestrutura de criação de perfil contínua para data centers e Criação contínua de perfis: aonde foram todos os ciclos?.

Tipos de criação de perfil disponíveis

A tabela a seguir resume os tipos de perfil compatíveis:

Tipo de perfil Go Java Node.js Python
Tempo de CPU SS S
Heap SS S
Heap alocada S
Contenção S
Linhas de execução S
Tempo decorrido S SS

O restante desta seção fornece mais detalhes sobre cada um desses tipos de perfil.

Medição de tempo

  • Tempo de CPU é o tempo que a CPU gasta executando um bloco de código.

    O tempo de CPU de uma função informa quanto tempo a CPU ficou ocupada executando as instruções. Ele não inclui o tempo que a CPU passou esperando ou processando instruções para outra coisa.

  • Tempo decorrido é o tempo que leva para executar um bloco de código.

    O tempo decorrido de uma função mede o tempo que passou entre a entrada e a saída de uma função. O tempo decorrido inclui todo o tempo de espera, incluindo os de bloqueio e sincronização de linhas de execução. O tempo decorrido de um bloco de código nunca pode ser menor que o da CPU.

Se o tempo decorrido for significativamente maior que o da CPU, isso indicará que o código passa muito tempo aguardando. Isso pode ser uma indicação de um gargalo de recursos.

Se o tempo de CPU estiver próximo do tempo decorrido, isso indica que o bloco de código consome muita CPU, isto é, quase todo o tempo necessário para a execução é gasto pela CPU. Os blocos de código com uso intensivo de CPU de longa duração podem ser candidatos à otimização.

Consumo de heap (memória)

  • O consumo de heap (também chamado de heap) é a quantidade de memória alocada no heap do programa quando o perfil é coletado.

  • A alocação de heap (também chamada de heap alocada) é a quantidade total de memória alocada no heap do programa, incluindo a memória que foi liberada e não está mais em uso.

Ao criar o perfil do consumo de heap, você encontra possíveis ineficiências e vazamentos de memória nos programas. Com criação de perfis de alocações de heap, é possível saber quais delas estão gerando mais trabalho para o coletor de lixo.

Informações sobre linhas de execução

Os aplicativos que criam linhas de execução podem ter alguns problemas, como linhas bloqueadas, outras que são criadas, mas nunca executadas e vazamentos em que o número de linhas de execução criadas continua aumentando. O primeiro problema é uma das causas do segundo.

Contenção

Em um programa de várias linhas de execução, o tempo gasto na espera para serializar o acesso a um recurso compartilhado pode ser grande. Entender o comportamento da contenção orienta o design do código e fornece informações para fazer ajustes no desempenho.

Coleta de perfis

O papel do agente de criação de perfil é capturar dados de perfil do aplicativo e transmitir esses dados para o back-end do Profiler usando a API Profiler. Cada perfil é para uma única instância de um aplicativo e inclui quatro campos que identificam exclusivamente sua implantação:

  • Projeto do GCP
  • Nome do app
  • Zona do aplicativo
  • Versão do aplicativo

Quando um agente está pronto para capturar um perfil, ele emite um comando da API Profiler para o back-end do Profiler. O back-end recebe essa solicitação e, no cenário mais simples, responde imediatamente ao agente. A resposta especifica o tipo de perfil a ser capturado. Em resposta, o agente captura o perfil e o transmite para o back-end. Por fim, o back-end do Profiler associa o perfil ao seu projeto do Google Cloud. É possível visualizá-lo e analisá-lo usando a IU do Profiler.

A sequência real de handshake é mais complexa do que a descrita no parágrafo anterior. Por exemplo, quando o Profiler recebe uma solicitação de um agente que está pronto para coletar um perfil, o back-end verifica o banco de dados dele para determinar se ele recebeu solicitações anteriores do agente. Caso contrário, o back-end adicionará as informações do agente ao banco de dados. Uma nova implantação será criada se os campos de implantação do agente não corresponderem aos de qualquer outro agente registrado.

A cada minuto, em média, e para cada implantação e cada tipo de perfil, o back-end seleciona um agente e o instrui a capturar um perfil. Por exemplo, se os agentes de uma implantação forem compatíveis com a criação de perfil de tempo decorrido e de heap, em média, dois perfis serão capturados por minuto:

  • Para todos os tipos de perfil, exceto o consumo de heap e o consumo de linhas de execução, um único perfil representa os dados coletados por 10 segundos.

  • Para os perfis de linha de execução e consumo de heap, cada perfil é coletado instantaneamente.

É importante observar que, depois que o agente notifica o back-end do Profiler para capturar dados, ele fica ocioso até receber uma resposta do back-end que especifica o tipo de perfil a ser capturado. Se você tiver 10 instâncias de um aplicativo em execução na mesma implantação, crie 10 agentes de criação de perfil. No entanto, na maioria das vezes, esses agentes ficam inativos. Em um período de 10 minutos, são esperados 10 perfis. Cada agente recebe uma resposta para cada tipo de perfil, em média. Há uma ordem aleatória envolvida, então o número real pode variar.

O back-end do Profiler usa as cotas da API Profiler e os campos de implantação do perfil para limitar os perfis processados. Saiba mais sobre como visualizar e gerenciar suas cotas do Profiler em Cotas e limites.