Profilazione delle applicazioni Java
In questa pagina viene descritto come modificare l'applicazione Java per acquisire profilazione dei dati e l'invio di questi dati al tuo account Google Cloud progetto. Per informazioni generali sulla profilazione, consulta Concetti di profilazione.
Tipi di profilo per Java:
- Tempo CPU
- Heap (richiede l'ambiente standard Java 11 o App Engine, disabilitato per impostazione predefinita)
- Tempo totale di esecuzione (non disponibile per l'ambiente standard Java 8 App Engine)
Versioni del linguaggio Java supportate:
- JVM basate su HotSpot (incluse le build Oracle JDK e alcune build OpenJDK) per Java 8, 11 o versioni successive.
Versioni dell'agente di profilazione supportate:
- È supportata la release più recente dell'agente. In generale, le release meno recenti oltre un anno non sono supportate. Ti consigliamo di utilizzare una versione rilasciata di recente dell'agente.
Sistemi operativi supportati:
- Linux. La profilazione delle applicazioni Java è supportata per i kernel Linux
la cui libreria C standard è implementata con
glibc
o conmusl
. Per per la configurazione specifiche dei kernel alpini di Linux, vedi In esecuzione su Linux Alps.
Ambienti supportati:
- Compute Engine
- Google Kubernetes Engine (GKE)
- Ambiente flessibile di App Engine
- Ambiente standard di App Engine (richiede l'SDK App Engine versione 1.9.64 o successive)
- Dataproc (per informazioni, vedi Configurazione di Cloud Profiler per i job Dataproc Spark e Hadoop.)
- Al di fuori di Google Cloud (per informazioni sugli altri requisiti di configurazione, consulta Profilazione delle applicazioni in esecuzione al di fuori di Google Cloud.)
Abilitazione dell'API Profiler
Prima di utilizzare l'agente di profilazione, assicurati che l'elemento sottostante L'API Profiler è abilitata. Puoi controllare lo stato dell'API e abilitare e, se necessario, utilizzando Google Cloud CLI la console Google Cloud:
Interfaccia a riga di comando gcloud
Se non hai già installato Google Cloud CLI sul tuo consulta la documentazione di Google Cloud CLI.
Esegui questo comando:
gcloud services enable cloudprofiler.googleapis.com
Per ulteriori informazioni, vedi
gcloud services
.
Console Google Cloud
-
Attiva l'API richiesta.
Se viene visualizzato API abilitata, l'API è già abilitata. In caso contrario, fai clic sul pulsante Attiva.
Installazione dell'agente Profiler
Compute Engine
Crea una directory di installazione, ad esempio
/opt/cprof
, per Agente Profiler:sudo mkdir -p /opt/cprof
Scarica l'archivio degli agenti da
storage.googleapis.com
repository ed estrarlo nella directory di installazione:wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \ | sudo tar xzv -C /opt/cprof
GKE
Modifica Dockerfile
per creare una directory di installazione per
Profiler, scarica l'archivio degli agenti
ed estrai l'archivio nella directory di installazione.
Linux (libreria C basata su glibc
):
Utilizza il seguente comando di installazione:
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 Alps (libreria C basata su musl
):
Utilizza il seguente comando di installazione:
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent_alpine.tar.gz \ | tar xzv -C /opt/cprof
Ambiente flessibile
Quando utilizzi il Immagine di base del runtime Java 8 il runtime Java 9 / Jetty 9 di base, l'agente Profiler è preinstallato, quindi non sono necessari passaggi aggiuntivi per installare l'agente.
Per tutte le altre immagini di base, devi installare l'agente. Ad esempio,
che segue Dockerfile
contiene le istruzioni per usare il
Immagine openjdk:11-slim
, per installare Profiler
dell'agente e definisce i parametri predefiniti da utilizzare all'avvio dell'agente
applicazione:
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"]
Per utilizzare questo Dockerfile
con l'ambiente flessibile di App Engine, devi
procedi nel seguente modo:
- Sostituisci
OPTION1
eOPTION2
con valori necessari della configurazione dell'agente per la tua applicazione e sostituisciPATH_TO_YOUR_JAR_FILE
con il percorso del tuo file jar. - Inserisci
Dockerfile
nella stessa directory del fileapp.yaml
. - Modifica il file
app.yaml
per specificare un runtime personalizzato. Per ulteriori informazioni, consulta la sezione Creazione di runtime personalizzati.
Ambiente standard
Quando utilizzi l'ambiente di runtime Java,
l'agente Profiler è preinstallato, quindi
i passaggi aggiuntivi da eseguire per installare l'agente.
Per Java 11 e versioni successive, è preinstallato in /opt/cprof
.
Al di fuori di Google Cloud
Crea una directory di installazione, ad esempio
/opt/cprof
, per Agente Profiler:sudo mkdir -p /opt/cprof
Scarica l'archivio degli agenti da
storage.googleapis.com
repository ed estrarlo nella directory di installazione:wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \ | sudo tar xzv -C /opt/cprof
Per elencare tutte le versioni dell'agente disponibili per il download, esegui questo comando:
gsutil ls gs://cloud-profiler/java/cloud-profiler-*
La risposta al comando è simile alla seguente:
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
Per scaricare una versione specifica dell'agente, passa il relativo URL a il comando di download. Ad esempio, per scaricare l'agente creato il 28 ottobre 2019, utilizzeresti la seguente affermazione:
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/cloud-profiler-java-agent_20191028_RC00.tar.gz \
| sudo tar xzv -C /opt/cprof
La versione dell'agente viene registrata durante l'inizializzazione.
Caricamento dell'agente Profiler in corso...
Per profilare la tua applicazione, avvia Java come faresti normalmente per eseguire ma devi specificare le opzioni di configurazione dell'agente. Devi specificare il percorso alla libreria degli agenti, oltre a passare le opzioni alla libreria.
Per l'ambiente standard App Engine, l'agente viene caricato automaticamente e configurato. Passa direttamente ad Avvio del programma. per informazioni dettagliate sulla configurazione e sull'avvio del programma.
Configurazione agente
Per configurare l'agente di profilazione, includi il flag -agentpath
all'avvio
la tua applicazione:
-agentpath:INSTALL_DIR/profiler_java_agent.so=OPTION1,OPTION2,OPTION3
In questa espressione, INSTALL_DIR
è il percorso dell'agente di profilazione, mentre
OPTION1
, OPTION2
e OPTION3
sono opzioni di configurazione dell'agente. Per
ad esempio, se sostituisci OPTION1
con -cprof_service=myapp
nella precedente
, quindi imposti il nome del servizio su myapp
. Nessuna limitazione
sul numero di opzioni o sul loro ordine. Opzioni di configurazione supportate
sono elencati nella tabella seguente:
Opzione agente | Descrizione |
---|---|
-cprof_service
|
Se la tua applicazione non è in esecuzione su App Engine, devi
utilizza questa opzione di configurazione
per impostare il nome del servizio.
Per le limitazioni relative ai nomi dei servizi, vedi
Argomenti Nome servizio e versione.
|
-cprof_service_version
|
Se vuoi avere la possibilità di analizzare i dati di profilazione utilizzando il UI Profiler in base alla versione del servizio, usa questa opzione per impostare la versione. Per i limiti di versione, vedi Argomenti Nome servizio e versione. |
-cprof_project_id
|
Quando esegui l'esecuzione al di fuori di Google Cloud, utilizza questa opzione per e specificare l'ID progetto Google Cloud. Per ulteriori informazioni, consulta Profilazione delle applicazioni in esecuzione al di fuori di Google Cloud. |
-cprof_zone_name
|
Quando la tua applicazione è in esecuzione su Google Cloud, l'agente di profilazione determina la zona tramite di comunicare con Servizio di metadati di Compute Engine. Se l'agente di profilazione non riesce a comunicare con il servizio di metadati, questa opzione. |
-cprof_gce_metadata_server_retry_count -cprof_gce_metadata_server_retry_sleep_sec
|
Queste due opzioni definiscono insieme il criterio per i nuovi tentativi che il profiler
che l'agente utilizza quando comunica
Servizio di metadati di Compute Engine.
per raccogliere l'ID progetto Google Cloud
e le informazioni sulla zona.
Il criterio predefinito prevede di riprovare fino a 3 volte con un secondo tra un secondo e l'altro tentativi. Questo criterio è sufficiente per la maggior parte delle configurazioni. |
-cprof_cpu_use_per_thread_timers
|
Per i profili di tempo di CPU più precisi, imposta questa opzione
su true. L'utilizzo di questa opzione comporta un aumento dell'overhead per thread.
Il valore predefinito è false. |
-cprof_force_debug_non_safepoints
|
Per impostazione predefinita, l'agente di profilazione obbliga la JVM a generare il debug
per il codice generato JIT, in aggiunta
alla generazione delle informazioni di debug
per tutti i punti di interesse. Ciò comporta
le informazioni più precise sulla funzione e sulla posizione a livello di linea per il tempo di CPU
e i profili heap, a scapito dell'overhead aggiuntivo dell'agente. Puoi
disattiva la generazione di informazioni di debug per il codice JIT impostando
questa opzione su false. Il valore predefinito è true. |
-cprof_wall_num_threads_cutoff
|
Per impostazione predefinita, i profili del wall non vengono raccolti se il numero totale di thread
nell'applicazione è maggiore di 4096. Il limite garantisce che durante il profilo
raccolta, il costo di attraversare lo stack di thread è minimo.
Se il servizio normalmente ha più di 4096 thread e se vuoi
per raccogliere i dati di profilazione a scapito di costi aggiuntivi, usa
questo flag per aumentare il limite. Il limite predefinito è 4096 thread. |
-cprof_enable_heap_sampling
|
Per attivare la profilazione heap per Java 11 e versioni successive, imposta-cprof_enable_heap_sampling=true .
La profilazione dell'heap non è supportata per Java 10 e versioni precedenti.La profilazione dell'heap è disattivata per impostazione predefinita. Quando abiliti la profilazione heap, l'intervallo di campionamento viene impostato su 512 KiB per impostazione predefinita. Questo intervallo è sufficiente per la maggior parte delle applicazioni e comporta meno dello 0,5% di overhead per l'applicazione. Intervalli di campionamento da Sono supportati da 256 KiB (262144) a 1024 KiB (1048576). Ad esempio, per impostare l'intervallo di campionamento su 256 KiB, che raddoppia il frequenza di campionamento, aggiungi l'opzione dell'agente:
Analogamente, per impostare l'intervallo di campionamento su 1024 KiB, dimezzando
frequenza di campionamento, aggiungi l'opzione dell'agente:
Se abiliti questo tipo di profilo, specifica una nuova versione del servizio
quando esegui il deployment dell'applicazione. Per ulteriori informazioni, vedi
Perché non ho i dati per un tipo di profilo specifico?
|
Argomenti per nome e versione del servizio
Quando carichi l'agente Profiler, specifichi un argomento service-name e un un argomento facoltativo service-version per configurarlo.
Il nome del servizio consente a Profiler di raccogliere dati di profilazione per tutti di repliche di quel servizio. Il servizio profiler garantisce tasso di raccolta di un profilo al minuto, in media, per ogni servizio in ogni combinazione di versioni e zone del servizio.
Ad esempio, se hai un servizio con due versioni in esecuzione di repliche in tre zone, il profiler creerà una media di 6 profili al minuto per quel servizio.
Se utilizzi nomi di servizio diversi per le repliche, il servizio essere profilati più spesso del necessario, con un overhead di conseguenza più elevato.
Quando selezioni il nome di un servizio:
Scegli un nome che rappresenti chiaramente il servizio nella tua applicazione dell'architettura. La scelta del nome del servizio è meno importante se esegui solo un singolo servizio o una singola applicazione. È più importante che la tua applicazione viene eseguito come un insieme di microservizi, ad esempio.
Assicurati di non utilizzare valori specifici per il processo, ad esempio un ID processo, nella stringa service-name.
La stringa del nome del servizio deve corrispondere a questa espressione regolare:
^[a-z0-9]([-a-z0-9_.]{0,253}[a-z0-9])?$
Una buona linea guida è usare una stringa statica come imageproc-service
come
il nome del servizio.
La versione del servizio è facoltativa. Se specifichi la versione del servizio, Profiler può aggregare le informazioni di profilazione da più le istanze VM e visualizzarle correttamente. Può essere usato per contrassegnare versioni diverse dei servizi durante il loro deployment. La UI di Profiler ti consente filtrare i dati in base alla versione del servizio; In questo modo, puoi confrontare il rendimento delle versioni più vecchie e più recenti del codice.
Il valore dell'argomento service-version è una stringa in formato libero, ma valori
per questo argomento generalmente sono i numeri di versione, ad esempio
1.0.0
o 2.1.2
.
Avvio del programma
Compute Engine
Avvia Java come faresti normalmente per eseguire il tuo programma e aggiungi il le opzioni di configurazione dell'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
Modifica il Dockerfile del container di servizio in modo da avviare Java come di consueto eseguire il programma e aggiungere le opzioni di configurazione dell'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 flessibile
Modifica il file di configurazione app.yaml
in
imposta la variabile di ambiente PROFILER_ENABLE
. Poi inizia
come di consueto:
env_variables:
PROFILER_ENABLE: true
Vedi Definizione delle variabili di ambiente per ulteriori informazioni.
Ambiente standard
Ambiente di runtime Java 21
Se non utilizzi i servizi in bundle legacy, attiva la raccolta profiler modificando il valore
app.yaml
per specificare il flag agentpath
utilizzando
uno dei seguenti metodi:
-
Imposta il parametro Variabile di ambiente
JAVA_TOOL_OPTIONS
:runtime: java21 env_variables: JAVA_TOOL_OPTIONS: "-agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true"
-
Specifica
agentpath
utilizzando l'elementoentrypoint
:runtime: java21 entrypoint: java \ -agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true \ Main.java
Se utilizzi i servizi in bundle legacy, attiva la raccolta profiler modificando il valore
appengine-web.xml
file per specificare il flag agentpath
utilizzando uno dei seguenti metodi:
-
Imposta il parametro Variabile di 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>
-
Imposta il parametro Variabile di 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>
-
Specifica
agentpath
utilizzando il parametro 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 per la raccolta è configurato un nuovo tipo di profilo, assicurati di specificare un una nuova versione del servizio quando esegui il deployment dell'applicazione. Per ulteriori informazioni, consulta la sezione Perché non disponiamo di dati per un tipo di profilo specifico?
Logging agente
L'agente di profilazione può segnalare le informazioni di logging per l'ambiente flessibile di App Engine, Compute Engine e con GKE. L'agente di profilazione supporta i seguenti livelli di logging:
0
: registra tutti i messaggi. Livello di logging predefinito.1
: registra messaggi di avviso, errore e irreversibili.2
: registra errori e messaggi irreversibili.3
: registra solo i messaggi irreversibili e interrompi l'applicazione.
Per abilitare la scrittura dei log in errore standard con il livello di logging predefinito,
aggiungi -logtostderr
alla configurazione -agentpath
.
Per impostare il livello di logging in modo che registri solo i messaggi di errore e irreversibili,
aggiungi -minloglevel=2
alla configurazione -agentpath
.
Ad esempio, per abilitare il logging dei messaggi di errore e irreversibili in errore standard,
aggiungi -logtostderr
e ‑minloglevel=2
al
Configurazione -agentpath
:
java -agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp,-logtostderr,-minloglevel=2 \
-jar myApp.jar
Risoluzione dei problemi
Questa sezione elenca i problemi specifici alla profilazione delle applicazioni Java. Consulta la sezione Risoluzione dei problemi. per ricevere assistenza in merito a problemi comuni.
Comportamento | Causa | Soluzione |
---|---|---|
Hai abilitato più profiler heap e non hai dati del profilo. | L'uso simultaneo di più profiler heap disattiva tutti gli heap il supporto della profilazione per Java. Si tratta di una limitazione JVM. | Attiva 1 profiler. |
Esecuzione con Linux alpino
L'agente di profilazione Java per Linux Alps è supportato solo per configurazioni di Google Kubernetes Engine.
Per installare l'agente di profilazione Java più recente per Linux Alps, consulta Installazione dell'agente Profiler.Errore di autenticazione
Se utilizzi immagini Docker eseguite con
Linux alpino
(ad es. golang:alpine
o solo alpine
),
potrebbe essere visualizzato il seguente errore di autenticazione:
connection error: desc = "transport: authentication handshake failed: x509: failed to load system roots and no roots provided"
Tieni presente che, per visualizzare l'errore, devi avere abilitato il logging dell'agente.
L'errore indica che le immagini Docker con Linux Alpine non hanno
certificati SSL radice installati per impostazione predefinita. Questi certificati sono necessari per
l'agente di profilazione per comunicare con l'API profiler. Da risolvere
questo errore, aggiungi il seguente comando apk
al tuo Dockerfile:
FROM alpine
...
RUN apk add --no-cache ca-certificates
Devi quindi ricreare la build ed eseguire nuovamente il deployment dell'applicazione.
Passaggi successivi
- Selezionare i profili da analizzare
- Interagire con il grafico a fiamme
- Filtrare il grafico a fiamme
- Metti a fuoco il grafico a fiamme
- Confrontare i profili