Criação de perfis de aplicações Java
Esta página descreve como modificar a sua aplicação Java para capturar dados de criação de perfis e enviar esses dados para o seu projeto do Google Cloud. Google CloudPara ver informações gerais acerca da criação de perfis, consulte o artigo Conceitos de criação de perfis.
Tipos de perfis para Java:
- Tempo da CPU
- Heap (requer o Java 11 ou o ambiente padrão do App Engine, desativado por predefinição)
- Tempo total (não disponível para o ambiente padrão do App Engine Java 8)
Versões do idioma Java compatíveis:
- JVMs baseadas em HotSpot (incluindo o Oracle JDK e algumas compilações do OpenJDK) para Java 8, 11 ou posterior.
Versões do agente de criação de perfis suportadas:
- A versão mais recente do agente é suportada. Geralmente, as versões com mais de um ano não são suportadas. Recomendamos que use a versão do agente lançada mais recentemente.
Sistemas operativos compatíveis:
- Linux. A criação de perfis de aplicações Java é suportada para kernels Linux cuja biblioteca C padrão é implementada com
glibc
ou commusl
. Para ver informações de configuração específicas dos kernels do Linux Alpine, consulte o artigo Execução no Linux Alpine.
Ambientes suportados:
- Compute Engine
- Google Kubernetes Engine (GKE)
- Ambiente flexível do App Engine
- Ambiente padrão do App Engine (requer a versão 1.9.64 ou posterior do SDK do App Engine)
- Dataproc (para mais informações, consulte o artigo Configurar o Cloud Profiler para tarefas do Dataproc Spark e Hadoop)
- Fora de Google Cloud (Para obter informações sobre os requisitos de configuração adicionais, consulte o artigo Criar perfis de aplicações em execução fora de Google Cloud.)
Ativar a API Profiler
Antes de usar o agente de criação de perfis, certifique-se de que a API Profiler subjacente está ativada. Pode verificar o estado da API e ativá-la, se necessário, através da CLI do Google Cloud ou da Google Cloud consola:
CLI gcloud
Se ainda não instalou a CLI do Google Cloud na sua estação de trabalho, consulte a documentação da CLI do Google Cloud.
Execute o seguinte comando:
gcloud services enable cloudprofiler.googleapis.com
Para mais informações, consulte
gcloud services
.
Google Cloud consola
-
Enable the required API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. Se for apresentada a mensagem API ativada, significa que a API já está ativada. Caso contrário, clique no botão Ativar.
Conceda a função do IAM à conta de serviço
Se estiver a implementar a sua aplicação em Google Cloud recursos e se estiver a usar a conta de serviço predefinida e não tiver modificado as concessões de funções para essa conta de serviço, pode ignorar esta secção.
Se realizar qualquer uma das seguintes ações, tem de conceder à conta de serviço a função do IAM de
agente do Cloud Profiler (roles/cloudprofiler.agent
):
- Está a usar a conta de serviço predefinida, mas modificou as concessões de funções.
- Está a usar uma conta de serviço criada pelo utilizador.
- Está a usar a identidade da carga de trabalho. Conceda a função de agente do Cloud Profiler à conta de serviço do Kubernetes.
Pode conceder uma função de IAM a uma conta de serviço através da
Google Cloud consola ou da CLI do Google Cloud. Por exemplo, pode usar o comando
gcloud projects add-iam-policy-binding
:
gcloud projects add-iam-policy-binding GCP_PROJECT_ID \
--member serviceAccount:MY_SVC_ACCT_ID@GCP_PROJECT_ID.iam.gserviceaccount.com \
--role roles/cloudprofiler.agent
Antes de usar o comando anterior, substitua o seguinte:
- GCP_PROJECT_ID: o ID do seu projeto.
- MY_SVC_ACCT_ID: o nome da sua conta de serviço.
Para ver informações detalhadas, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.
Instalar o agente do Profiler
Compute Engine
Crie um diretório de instalação, por exemplo,
/opt/cprof
, para o agente do Profiler:sudo mkdir -p /opt/cprof
Transfira o arquivo do agente do
storage.googleapis.com
repositório e extraia-o para o diretório de instalação:wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \ | sudo tar xzv -C /opt/cprof
GKE
Modifique o Dockerfile
para criar um diretório de instalação para o agente do Profiler, transfira o arquivo do agente e, em seguida, extraia o arquivo para o diretório de instalação.
Linux (biblioteca C baseada no glibc
):
Use o seguinte comando de instalação:
RUN mkdir -p /opt/cprof && \
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
| tar xzv -C /opt/cprof
Linux Alpine (biblioteca C baseada no musl
):
Use o seguinte comando de instalação:
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent_alpine.tar.gz \ | tar xzv -C /opt/cprof
Ambiente flexível
Quando usa a imagem base do tempo de execução do Java 8 da Google ou a imagem base do tempo de execução do Java 9 / Jetty 9, o agente do Profiler está pré-instalado, pelo que não tem de realizar passos adicionais para instalar o agente.
Para todas as outras imagens base, tem de instalar o agente. Por exemplo, o seguinte Dockerfile
contém as instruções para usar a imagem openjdk:11-slim
, instalar o agente do Profiler e define os parâmetros predefinidos a usar ao iniciar a aplicação:
FROM openjdk:11-slim
COPY . .
RUN apt-get update \
&& apt-get install wget \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /opt/cprof && \
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
| tar xzv -C /opt/cprof
CMD ["java", "-agentpath:/opt/cprof/profiler_java_agent.so=OPTION1,OPTION2", "-jar", "PATH_TO_YOUR_JAR_FILE"]
Para usar esta Dockerfile
com o ambiente flexível do App Engine, tem de
fazer o seguinte:
- Substitua
OPTION1
eOPTION2
pelos valores de configuração do agente necessários para a sua aplicação e substituaPATH_TO_YOUR_JAR_FILE
pelo caminho para o seu ficheiro JAR. - Coloque o ficheiro
Dockerfile
no mesmo diretório que o ficheiroapp.yaml
. - Modifique o ficheiro
app.yaml
para especificar um tempo de execução personalizado. Para mais informações, consulte o artigo Criar tempos de execução personalizados.
Ambiente padrão
Quando usa o ambiente de execução Java, o agente do Profiler está pré-instalado, pelo que não tem de realizar passos adicionais para instalar o agente.
Para a versão 11 e posteriores do Java, está pré-instalado no /opt/cprof
.
Fora de Google Cloud
Crie um diretório de instalação, por exemplo,
/opt/cprof
, para o agente do Profiler:sudo mkdir -p /opt/cprof
Transfira o arquivo do agente do
storage.googleapis.com
repositório e extraia-o para o diretório de instalação:wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \ | sudo tar xzv -C /opt/cprof
Para apresentar uma lista de todas as versões do agente disponíveis para transferência, execute o seguinte comando:
gcloud storage ls gs://cloud-profiler/java/cloud-profiler-*
A resposta do comando é semelhante à seguinte:
gs://cloud-profiler/java/cloud-profiler-java-agent_20191014_RC00.tar.gz gs://cloud-profiler/java/cloud-profiler-java-agent_20191021_RC00.tar.gz gs://cloud-profiler/java/cloud-profiler-java-agent_20191028_RC00.tar.gz
Para transferir uma versão específica do agente, transmita o respetivo URL para o comando de transferência. Por exemplo, para transferir o agente criado a 28 de outubro de 2019, usaria a seguinte declaração:
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/cloud-profiler-java-agent_20191028_RC00.tar.gz \
| sudo tar xzv -C /opt/cprof
A versão do agente é registada durante a respetiva inicialização.
A carregar o agente do Profiler
Para criar um perfil da sua aplicação, inicie o Java como faria normalmente para executar o seu programa, mas especifique as opções de configuração do agente. Especifica o caminho para a biblioteca do agente e pode transmitir opções para a biblioteca.
Para o ambiente padrão do App Engine, o agente é carregado e configurado automaticamente. Avançar para Iniciar o programa, para ver detalhes sobre a configuração e o início do programa.
Configuração do agente
Para configurar o agente de criação de perfis, inclua a flag -agentpath
ao iniciar a aplicação:
-agentpath:INSTALL_DIR/profiler_java_agent.so=OPTION1,OPTION2,OPTION3
Nesta expressão, INSTALL_DIR
é o caminho para o agente de criação de perfis, enquanto OPTION1
, OPTION2
e OPTION3
são opções de configuração do agente. Por exemplo, se substituir OPTION1
por -cprof_service=myapp
na expressão anterior, define o nome do serviço como myapp
. Não existe restrição
quanto ao número de opções nem à respetiva ordem. As opções de configuração suportadas
estão listadas na tabela seguinte:
Opção de agente | Descrição |
---|---|
-cprof_service
|
Se a sua aplicação não estiver a ser executada no App Engine, tem de
usar esta opção de configuração para definir o nome do serviço.
Para restrições de nomes de serviços, consulte o artigo
Argumentos de nome e versão do serviço.
|
-cprof_service_version
|
Quando quiser analisar os dados de criação de perfis através da IU do Profiler por versão do serviço, use esta opção para definir a versão. Para restrições de versão, consulte os Argumentos de nome e versão do serviço. |
-cprof_project_id
|
Quando estiver a executar fora do Google Cloud, use esta opção para especificar o ID do projeto Google Cloud . Para mais informações, consulte o artigo Criar perfis de aplicações em execução fora do Google Cloud. |
-cprof_zone_name
|
Quando a sua aplicação está em execução no Google Cloud, o agente de criação de perfis determina a zona através da comunicação com o serviço de metadados do Compute Engine. Se o agente de criação de perfis não conseguir comunicar com o serviço de metadados, tem de usar esta opção. |
-cprof_gce_metadata_server_retry_count -cprof_gce_metadata_server_retry_sleep_sec
|
Em conjunto, estas duas opções definem a política de repetição que o agente do Profiler usa quando comunica com o serviço de metadados do Compute Engine.
para recolher o seu Google Cloud ID do projeto e informações da zona.
A política predefinida é repetir até 3 vezes, aguardando 1 segundo entre as tentativas. Esta política é suficiente para a maioria das configurações. |
-cprof_cpu_use_per_thread_timers
|
Para os perfis de tempo da CPU mais precisos, defina esta opção como verdadeira. A utilização desta opção resulta num aumento da sobrecarga por segmento.
O valor predefinido é false. |
-cprof_force_debug_non_safepoints
|
Por predefinição, o agente de criação de perfis força a JVM a gerar informações de depuração para todo o código gerado no momento (JIT), além de gerar informações de depuração para todos os pontos de segurança. Isto resulta nas informações de localização ao nível da linha e da função mais precisas para o tempo de CPU e os perfis de memória ao custo de uma sobrecarga adicional do agente. Pode
desativar a geração de informações de depuração para código JIT definindo
esta opção como falsa. O valor predefinido é True. |
-cprof_wall_num_threads_cutoff
|
Por predefinição, os perfis de parede não são recolhidos se o número total de threads na aplicação exceder 4096. O limite garante que, durante a recolha de perfis, o custo de percorrer a pilha de threads é mínimo.
Se o seu serviço tiver normalmente mais de 4096 threads e quiser
recolher dados de criação de perfis à custa de sobrecarga adicional, use
esta flag para aumentar o limite. O limite predefinido é de 4096 threads. |
-cprof_enable_heap_sampling
|
Para ativar a criação de perfis de memória dinâmica para o Java 11 e superior, defina-cprof_enable_heap_sampling=true .
A criação de perfis de memória dinâmica não é suportada para o Java 10 e inferior.A criação de perfis de memória está desativada por predefinição. Quando ativa a criação de perfis de memória, o intervalo de amostragem é definido como 512 KiB por predefinição. Este intervalo é suficiente para a maioria das aplicações e incorre num custo adicional inferior a 0,5% para a aplicação. São suportados intervalos de amostragem de 256 KiB (262144) a 1024 KiB (1048576). Por exemplo, para definir o intervalo de amostragem como 256 KiB, o que duplica a taxa de amostragem, adicione a opção do agente:
|
Argumentos de nome e versão do serviço
Quando carrega o agente do Profiler, especifica um argumento service-name e um argumento service-version opcional para o configurar.
O nome do serviço permite que o Profiler recolha dados de criação de perfis para todas as réplicas desse serviço. O serviço de criação de perfis garante uma taxa de recolha de um perfil por minuto, em média, para cada nome de serviço em todas as combinações de versões e zonas de serviço.
Por exemplo, se tiver um serviço com duas versões em execução em réplicas em três zonas, o criador de perfis cria uma média de 6 perfis por minuto para esse serviço.
Se usar nomes de serviços diferentes para as suas réplicas, o serviço é perfilado com mais frequência do que o necessário, com uma sobrecarga correspondentemente mais elevada.
Ao selecionar um nome do serviço:
Escolha um nome que represente claramente o serviço na arquitetura da sua aplicação. A escolha do nome do serviço é menos importante se executar apenas um único serviço ou aplicação. É mais importante se a sua aplicação for executada como um conjunto de microsserviços, por exemplo.
Certifique-se de que não usa valores específicos do processo, como um ID do processo, na string service-name.
A string service-name tem de corresponder a esta expressão regular:
^[a-z0-9]([-a-z0-9_.]{0,253}[a-z0-9])?$
Uma boa diretriz é usar uma string estática como imageproc-service
como o nome do serviço.
A versão do serviço é opcional. Se especificar a versão do serviço, o Profiler pode agregar informações de criação de perfis de várias instâncias e apresentá-las corretamente. Pode ser usado para marcar diferentes versões dos seus serviços à medida que são implementadas. A IU do Profiler permite-lhe filtrar os dados por versão do serviço. Desta forma, pode comparar o desempenho de versões mais antigas e mais recentes do código.
O valor do argumento service-version é uma string de forma livre, mas os valores
deste argumento têm normalmente o aspeto de números de versão, por exemplo,
1.0.0
ou 2.1.2
.
Iniciar o programa
Compute Engine
Inicie o Java como faria normalmente para executar o seu programa e adicione as opções de configuração do agente:
java \
-agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp,-cprof_service_version=1.0.0 \
JAVA_OPTIONS -jar PATH_TO_YOUR_JAR_FILE PROGRAM_OPTIONS
GKE
Modifique o Dockerfile do contentor de serviço para iniciar o Java como faria normalmente para executar o seu programa e adicione as opções de configuração do agente:
CMD ["java", \
"-agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp,-cprof_service_version=1.0.0", \
"-jar", "PATH_TO_YOUR_JAR_FILE" ]
Ambiente flexível
Modifique o ficheiro de configuração app.yaml
para definir a variável de ambiente PROFILER_ENABLE
. Em seguida, inicie
o programa como habitualmente:
env_variables:
PROFILER_ENABLE: true
Consulte o artigo Definir variáveis de ambiente para mais informações.
Ambiente padrão
Java 21 runtime environment
Se não usar serviços agrupados antigos, ative a recolha do Profiler modificando o ficheiro app.yaml
para especificar a flag agentpath
através de qualquer um dos seguintes métodos:
-
Defina a variável de ambiente
JAVA_TOOL_OPTIONS
:runtime: java21 env_variables: JAVA_TOOL_OPTIONS: "-agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true"
-
Especifique o
agentpath
através do elementoentrypoint
:runtime: java21 entrypoint: java \ -agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true \ Main.java
Se usar serviços agrupados antigos, ative a recolha do criador de perfis modificando o ficheiro
appengine-web.xml
para especificar a flag agentpath
através de um dos seguintes métodos:
-
Defina a variável de ambiente :
JAVA_USER_OPTS
<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <env-variables> <env-var name="JAVA_USER_OPTS" value="-agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true" /> </env-variables> </appengine-web-app>
-
Defina a variável de ambiente :
CPROF_ENABLE
<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <env-variables> <env-var name="CPROF_ENABLE" value="-agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true" /> </env-variables> </appengine-web-app>
-
Especifique o
agentpath
através do elementoentrypoint
:<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <entrypoint> java -agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true </entrypoint> </appengine-web-app>
Se for configurado um novo tipo de perfil para a recolha, certifique-se de que especifica uma nova versão do serviço quando implementar a sua aplicação. Para mais informações, consulte o artigo Por que motivo não tenho dados para um tipo de perfil específico?
Registo do agente
O agente de criação de perfis pode comunicar informações de registo para o ambiente flexível do App Engine, o Compute Engine e o GKE. O agente de criação de perfis suporta os seguintes níveis de registo:
0
: registar todas as mensagens. Nível de registo predefinido.1
: registar mensagens de aviso, erro e fatais.2
: registar mensagens de erro e fatais.3
: registar apenas mensagens fatais e parar a aplicação.
Para ativar a escrita de registos no erro padrão com o nível de registo predefinido,
anexe -logtostderr
à configuração -agentpath
.
Para definir o nível de registo de modo a registar apenas mensagens de erro e fatais,
anexe -minloglevel=2
à configuração -agentpath
.
Por exemplo, para ativar o registo de mensagens de erro e críticas no erro padrão, acrescente -logtostderr
e ‑minloglevel=2
à configuração -agentpath
:
java -agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp,-logtostderr,-minloglevel=2 \
-jar myApp.jar
Resolução de problemas
Esta secção lista problemas específicos da criação de perfis de aplicações Java. Consulte a resolução de problemas para obter ajuda com problemas comuns.
Comportamento | Causa | Solução |
---|---|---|
Ativou vários criadores de perfis de memória e não tem dados de perfis. | A utilização simultânea de vários criadores de perfis de memória desativa todo o suporte de criação de perfis de memória para Java. Esta é uma limitação da JVM. | Ative 1 gerador de perfis. |
Execução com o Linux Alpine
O agente de criação de perfis Java para Linux Alpine só é suportado para configurações do Google Kubernetes Engine.
Para instalar o agente de criação de perfis Java mais recente para o Linux Alpine, consulte o artigo Instalar o agente do Profiler.Erro de autenticação
Se usar imagens do Docker executadas com o
Linux Alpine
(como golang:alpine
ou apenas alpine
),
pode ver o seguinte erro de autenticação:
connection error: desc = "transport: authentication handshake failed: x509: failed to load system roots and no roots provided"
Tenha em atenção que, para ver o erro, tem de ter o registo do agente ativado.
O erro indica que as imagens do Docker com o Linux Alpine não têm os certificados SSL de raiz instalados por predefinição. Esses certificados são necessários para que o agente de criação de perfis comunique com a API Profiler. Para resolver este erro, adicione o seguinte comando apk
ao seu Dockerfile:
FROM alpine
...
RUN apk add --no-cache ca-certificates
Em seguida, tem de recriar e voltar a implementar a aplicação.
O que se segue?
- Selecione os perfis a analisar
- Interaja com o gráfico de rastreio em pilhas sobrepostas
- Filtre o gráfico de rastreio em pilhas sobrepostas
- Foque o gráfico de rastreio em pilhas sobrepostas
- Compare perfis