Criação de perfis de conceitos

A criação de perfis é uma forma de análise de código dinâmico. Captura as caraterísticas da aplicação durante a execução e, em seguida, usa estas informações para identificar como tornar a aplicação mais rápida e eficiente.

Historicamente, a criação de perfis era realizada apenas durante o desenvolvimento de aplicações. Esta abordagem baseava-se na capacidade de desenvolver testes de carga e referências que pudessem prever com precisão um ambiente de produção.

A criação de perfis contínua refere-se à criação de perfis da aplicação enquanto é executada num ambiente de produção. Esta abordagem evita a necessidade de desenvolver testes de carga preditivos precisos e referências para o ambiente de produção. A investigação sobre a criação de perfis contínua mostrou que é precisa e rentável*.

O Cloud Profiler é uma ferramenta de criação de perfis contínua concebida para aplicações em execução no Google Cloud:

  • É um perfilador estatístico ou de amostragem com uma sobrecarga baixa e adequado para ambientes de produção.

  • Suporta idiomas comuns e recolhe vários tipos de perfis. Consulte o artigo Tipos de criação de perfis disponíveis para uma vista geral.

Configurar uma Google Cloud aplicação para gerar dados do perfil é um processo simples e único: associe ou execute o seu serviço com um agente de criação de perfis incluído. Depois de a aplicação ser implementada, o agente de criação de perfis é executado periodicamente para recolher dados de desempenho e, em seguida, envia esses dados para o seu Google Cloud projeto. Para ver detalhes sobre este processo, consulte o artigo Recolha de perfis.

Depois de recolher dados do perfil da sua aplicação, pode analisar os dados através da interface do Profiler. Normalmente, a análise dos dados do perfil é um processo iterativo que se baseia no seu conhecimento do design da aplicação e da respetiva linguagem de programação.

*Consulte os seguintes artigos: Google-Wide Profiling: A Continuous Profiling Infrastructure for Data Centers e Continuous Profiling: Where Have All the Cycles Gone?.

Tipos de criação de perfis disponíveis

A tabela seguinte resume os tipos de perfis suportados:

Tipo de perfil Ir Java Node.js Python
Tempo da CPU YY Y
Memória YY Y
Memória dinâmica atribuída Y
Contenção Y
Discussões Y
Tempo entre o início e o fim da tarefa Y YY

O resto desta secção fornece mais detalhes sobre cada um destes tipos de perfis.

Medições de tempo

  • O tempo da CPU é o tempo que a CPU dedica à execução de um bloco de código.

    O tempo da CPU de uma função indica durante quanto tempo a CPU esteve ocupada a executar instruções. Não inclui o tempo que a CPU estava a aguardar ou a processar instruções para outra coisa.

  • O tempo real (também denominado tempo de execução) é o tempo necessário para executar um bloco de código.

    O tempo real de uma função mede o tempo decorrido entre a entrada e a saída de uma função. O tempo real inclui todo o tempo de espera, incluindo o tempo de espera para bloqueios e sincronização de threads. O tempo real de um bloco de código nunca pode ser inferior ao tempo de CPU.

Se o tempo real for superior ao tempo da CPU, isso indica que o código passa tempo à espera. Quando a diferença é substancial, a sua aplicação pode ter um gargalo de recursos.

Se o tempo da CPU for semelhante ao tempo real, isso indica que o código requer muita capacidade da CPU. Quase todo o tempo necessário para a execução é gasto pela CPU. Os blocos de código de execução prolongada com utilização intensiva da CPU podem ser candidatos à otimização.

Utilização de memória heap

  • A utilização de memória heap (também denominada heap) é a quantidade de memória atribuída na memória heap do programa no instante em que o perfil é recolhido. Ao contrário de outros tipos de perfis em que os dados são recolhidos durante um intervalo, este tipo de perfil recolhe a utilização da memória dinâmica num único ponto no tempo.

  • A afetação de memória dinâmica (também denominada memória dinâmica afetada) é a quantidade total de memória que foi afetada na memória dinâmica do programa durante o intervalo em que o perfil foi recolhido. Este valor inclui qualquer memória que tenha sido atribuída e libertada, e que já não esteja em uso. Por exemplo, considere uma tarefa que repete a seguinte sequência: atribui 1 MiB, espera 500 ms, liberta 1 MiB e espera 500 ms. Nos 10 segundos em que o perfil de memória atribuída é recolhido, existem 10 atribuições e 10 liberações. Este perfil mostraria 10 MiB de memória dinâmica atribuída, uma vez que as liberações não são consideradas. A taxa média de atribuição é de 10 MiB/10 segundos ou 1 MiB por segundo.

A criação de perfis de utilização da memória dinâmica ajuda a encontrar potenciais ineficiências e fugas de memória nos seus programas. A criação de perfis de atribuições de memória dinâmica ajuda a saber que atribuições estão a causar mais trabalho ao coletor de lixo.

Informações sobre discussões

As aplicações que criam threads podem sofrer de threads bloqueadas e de fugas de threads:

  • As discussões bloqueadas são discussões criadas, mas que estão a aguardar um bloqueio. Estes threads não estão a ser executados atualmente e podem nunca ser executados. No entanto, um segmento bloqueado pode ser executado eventualmente.
  • As fugas de threads ocorrem quando o número de threads criadas continua a aumentar.

As discussões bloqueadas são uma causa de discussões divulgadas.

Ao nível do frame, o perfil Thread apresenta o número médio de threads que incluem esse frame. Este tipo de perfil recolhe a utilização de threads num único ponto no tempo.

Contenção

Num programa com várias linhas de execução, o tempo gasto à espera da serialização do acesso a um recurso partilhado pode ser significativo. A compreensão do comportamento de contenção pode orientar a conceção do código e fornecer informações para a otimização do desempenho.

Recolha de perfis

A função do agente do Gerador de perfis é captar dados de perfis da sua aplicação e transmitir estes dados ao back-end do Gerador de perfis através da API Profiler. Cada perfil destina-se a uma única instância de uma aplicação e inclui quatro campos que identificam exclusivamente a respetiva implementação:

  • Google Cloud projeto
  • Nome da aplicação
  • Zona de aplicação
  • Versão da aplicação

Quando um agente está pronto para capturar um perfil, envia um comando da API Profiler para o back-end do Profiler. O back-end recebe este pedido e, no cenário mais simples, responde imediatamente ao agente. A resposta especifica o tipo de perfil a capturar. Em resposta, o agente captura o perfil e transmite-o ao back-end. Por último, o back-end do Profiler associa o perfil ao seu projeto do Google Cloud . Em seguida, pode vê-lo e analisá-lo através da interface do Profiler.

A sequência de confirmação real é mais complexa do que a descrita no parágrafo anterior. Por exemplo, quando o Profiler recebe um pedido de um agente, o back-end verifica a respetiva base de dados para determinar se recebeu pedidos anteriores do agente. Caso contrário, o back-end adiciona as informações do agente à respetiva base de dados. É criada uma nova implementação se os campos de implementação do agente não corresponderem às definições de nenhum outro agente registado.

A cada minuto, em média, e para cada implementação e cada tipo de perfil, o back-end seleciona um agente e dá-lhe instruções para capturar um perfil. Por exemplo, se os agentes de uma implementação suportarem a criação de perfis de tempo de espera e de tempo real, são capturados, em média, dois perfis por minuto:

  • Para todos os tipos de perfis, exceto a utilização da memória e as linhas de execução, um único perfil representa os dados recolhidos durante 10 segundos.

  • A utilização da memória e os perfis de threads são recolhidos instantaneamente.

Depois de o agente notificar o back-end do Profiler de que está pronto para capturar dados, o agente fica inativo até o back-end responder com o tipo de perfil a capturar. Se tiver 10 instâncias de uma aplicação em execução na mesma implementação, cria 10 agentes de criação de perfis. No entanto, na maioria das vezes, estes agentes estão inativos. Durante um período de 10 minutos, pode esperar 10 perfis; cada agente recebe, em média, uma resposta para cada tipo de perfil. Existe alguma aleatoriedade envolvida, pelo que o número real pode variar.

O back-end do Gerador de perfis usa quotas da API Profiler e os campos de implementação do perfil para limitar os perfis carregados. Para ver informações sobre a visualização e a gestão das suas quotas do Profiler, consulte o artigo Quotas e limites.

Analisar dados

Depois de o Perfilador recolher dados, pode ver e analisar estes dados através da interface do Perfilador.

Na Google Cloud consola, aceda à página Profiler:

Aceda ao Profiler

Também pode encontrar esta página através da barra de pesquisa.