Profilazione delle applicazioni Go
Questa pagina descrive come modificare l'applicazione Go per acquisire i dati di profilazione e inviarli al progetto Google Cloud. Per informazioni generali sulla profilazione, consulta Concetti di profilazione.
Tipi di profilo per Go:
- Tempo CPU
- Heap
- Heap allocato
- Concorrenza (mutex Go)
- Thread (goroutine Go)
Versioni del linguaggio Go supportate:
- Tutte le release di Go gestite ufficialmente, se non diversamente indicato. Per ulteriori informazioni, consulta le norme relative al rilascio del linguaggio Go.
Versioni dell'agente di profilazione supportate:
- È supportata la versione più recente dell'agente. In genere, le release precedenti a un anno non sono supportate. Ti consigliamo di utilizzare la versione dell'agente rilasciata più di recente.
Sistemi operativi supportati:
- Linux. Il profiling delle applicazioni Go è supportato per i kernel Linux la cui libreria C standard è implementata con
glibc
o conmusl
. Per informazioni sulla configurazione specifiche per i kernel Linux Alpine, consulta Esecuzione su Linux Alpine.
Ambienti supportati:
- Compute Engine
- Google Kubernetes Engine (GKE)
- Ambiente flessibile di App Engine
- Ambiente standard di App Engine (richiede Go 1.11 o versioni successive)
- Al di fuori di Google Cloud (per informazioni sui requisiti di configurazione aggiuntivi, consulta Eseguire il profiling delle applicazioni in esecuzione all'esterno di Google Cloud).
Attivazione dell'API Profiler
Prima di utilizzare l'agente di profilazione, assicurati che l'API Profiler di base sia abilitata. Puoi controllare lo stato dell'API e attivarla se necessario utilizzando Google Cloud CLI o la console Google Cloud:
Interfaccia a riga di comando gcloud
Se non hai ancora installato Google Cloud CLI sulla tua workstation, consulta la documentazione di Google Cloud CLI.
Esegui questo comando:
gcloud services enable cloudprofiler.googleapis.com
Per ulteriori informazioni, consulta
gcloud services
.
Console Google Cloud
-
Enable the required API.
Se viene visualizzato il messaggio API abilitata, significa che l'API è già abilitata. In caso contrario, fai clic sul pulsante Attiva.
Concedi il ruolo IAM all'account di servizio
Se stai eseguendo il deployment dell'applicazione sulle risorse Google Cloud, se utilizzi l'account di servizio predefinito e non hai modificato le concessioni dei ruoli a questo account, puoi saltare questa sezione.
Se esegui una delle seguenti operazioni, devi concedere all'account di servizio il ruolo IAM di agente Cloud Profiler (roles/cloudprofiler.agent
):
- Utilizzi l'account di servizio predefinito, ma ne hai modificato le concessioni dei ruoli.
- Stai utilizzando un account di servizio creato dall'utente.
- Se utilizzi Workload Identity, assegna il ruolo Agente Cloud Profiler all'account di servizio Kubernetes.
Puoi concedere un ruolo IAM a un account di servizio utilizzando la console Google Cloud o Google Cloud CLI. Ad esempio, puoi utilizzare il 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
Prima di utilizzare il comando precedente, sostituisci quanto segue:
- GCP_PROJECT_ID: l'ID del tuo progetto.
- MY_SVC_ACCT_ID: il nome del tuo account di servizio.
Per informazioni dettagliate, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.
Utilizzo di Cloud Profiler
In tutti gli ambienti supportati, puoi utilizzare il Profiler importando il pacchetto nell'applicazione e inizializzandolo il prima possibile.
Puoi attivare il profiling della contesa Mutex ("Contesa" nell'interfaccia) impostando l'opzione di configurazione MutexProfiling
su true
.
Per ulteriori informazioni sull'API Profiler, incluse tutte le opzioni di configurazione, consulta la documentazione dell'API pubblica.
Compute Engine
Per Compute Engine, in profiler.Config
imposta Service
con un nome per il servizio di cui viene eseguito il profilo e, facoltativamente, imposta ServiceVersion
con la versione del servizio:
Se nel codice sorgente sono presenti dipendenze recuperate manualmente, potresti dover aggiungere quanto segue allo script di compilazione o al Dockerfile:
go get cloud.google.com/go/profiler
GKE
Per GKE, in profiler.Config
imposta Service
con un
nome per il servizio di cui viene eseguito il profilo e, facoltativamente, imposta ServiceVersion
con
la versione del servizio:
Se nel codice sorgente sono presenti dipendenze recuperate manualmente, potresti dover aggiungere quanto segue allo script di compilazione o al Dockerfile:
go get cloud.google.com/go/profiler
App Engine
Per l'ambiente flessibile App Engine e l'ambiente standard App Engine, le aggiunte di codice sono quasi identiche a quelle per Compute Engine e GKE.
Esiste un'eccezione. In entrambi gli ambienti App Engine, i parametri Service
e ServiceVersion
vengono ricavati dall'ambiente, quindi non devi specificarli.
Quando esegui l'applicazione in locale, imposta i parametri ProjectID
(l'ID del progetto Google Cloud) e Service
in profiler.Config
, poiché non possono essere ricavati da un ambiente locale. Non è necessario impostare
ServiceVersion
.
Se utilizzi l'ambiente standard di App Engine, consulta Eseguire la migrazione dell'app a Go 1.11 per informazioni dettagliate sulle modifiche che potresti dover apportare all'applicazione. Inoltre, devi utilizzare la versione 226.0.0 o successive di Google Cloud CLI. Per aggiornare Google Cloud CLI, esegui il seguente comando:
gcloud components update
Per eseguire l'applicazione:
Aggiorna le dipendenze:
go get cloud.google.com/go/profiler
Esegui il deployment dell'applicazione nell'ambiente flessibile di App Engine o nell'ambiente standard di App Engine:
gcloud app deploy [DEPLOYMENT]
dove
DEPLOYMENT
è il percorso del file di configurazione. Ad esempio,DEPLOYMENT
potrebbe esseremain/app.yaml
.- Per informazioni dettagliate sul deployment nell'ambiente flessibile di App Engine, consulta Testare ed eseguire il deployment dell'applicazione.
- Per informazioni dettagliate sul deployment nell'ambiente standard di App Engine, consulta Test e deployment dell'applicazione.
Analisi dei dati
Dopo che Profiler ha raccolto i dati, puoi visualizzarli e analizzarli utilizzando l'interfaccia di Profiler.
Nella console Google Cloud, vai alla pagina Profiler:
Puoi trovare questa pagina anche utilizzando la barra di ricerca.
Argomenti nome e versione del servizio
Quando carichi l'agente Profiler, specifica un argomento service-name e un argomento service-version facoltativo per configurarlo.
Il nome del servizio consente a Profiler di raccogliere i dati di profilazione per tutte le repliche del servizio. Il servizio di profilazione garantisce un tasso di raccolta di un profilo al minuto, in media, per ogni nome di servizio in tutte le versioni e le zone dei servizi combinati.
Ad esempio, se hai un servizio con due versioni in esecuzione su repliche in tre zone, il profiler creerà in media 6 profili al minuto per quel servizio.
Se utilizzi nomi di servizi diversi per le repliche, il servizio verrà sottoposto a profilazione più spesso del necessario, con un overhead di conseguenza più elevato.
Quando selezioni un nome di servizio:
Scegli un nome che rappresenti chiaramente il servizio nell'architettura dell'applicazione. La scelta del nome del servizio è meno importante se esegui un solo servizio o un'unica applicazione. È più importante se la tua applicazione viene eseguita come un insieme di microservizi, ad esempio.
Assicurati di non utilizzare valori specifici per il processo, ad esempio un ID processo, nella stringa del nome del servizio.
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 è utilizzare una stringa statica come imageproc-service
come nome del servizio.
La versione del servizio è facoltativa. Se specifichi la versione del servizio, Profiler può aggregare le informazioni di profilazione di più istanze e visualizzarle correttamente. Può essere utilizzato per contrassegnare versioni diverse degli tuoi servizi durante il loro dispiegamento. L'interfaccia utente di Profiler consente di filtrare i dati in base alla versione del servizio. In questo modo, puoi confrontare il rendimento delle versioni precedenti e successive del codice.
Il valore dell'argomento service-version è una stringa di formato libero, ma i valori per questo argomento in genere assomigliano a numeri di versione, ad esempio 1.0.0
o 2.1.2
.
Logging dell'agente
L'agente di profilazione può segnalare informazioni di debug nei suoi log. Per impostazione predefinita, la registrazione dell'agente è disattivata.
Per attivare il logging dell'agente, imposta l'opzione DebugLogging
su true
all'avvio dell'agente:
profiler.Start(profiler.Config{..., DebugLogging: true});
Risoluzione dei problemi
Questa sezione elenca i problemi specifici per il profiling delle applicazioni Go. Per assistenza in merito ai problemi comuni, consulta la sezione Risoluzione dei problemi.
Comportamento | Causa | Soluzione |
---|---|---|
I profili di tempo della CPU non vengono raccolti per le applicazioni create con
-buildmode=c-archive . Vengono raccolti i profili di heap, contesa e thread.
Problema GitHub
|
Per impostazione predefinita, il profiling della CPU non è abilitato per le applicazioni Go quando il
-buildmode flag è c-archive o
c-shared . |
Aggiungi una chiamata asignal.Notify(make(
prima di chiamare profiler.Start .Risposta al problema di GitHub. |
Esecuzione con Linux Alpine
L'agente di profilazione Go per Linux Alpine è supportato solo per le configurazioni di Google Kubernetes Engine.
Errore di autenticazione
Se utilizzi immagini Docker che vengono eseguite con Linux Alpine (ad esempio golang:alpine
o solo alpine
), potresti visualizzare 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 aver attivato la registrazione degli agenti. Per impostazione predefinita, l'agente per Go non genera messaggi di log.
L'errore indica che le immagini Docker con Linux Alpine non hanno i certificati SSL di root installati per impostazione predefinita. Questi certificati sono necessari per consentire all'agente di profilazione di comunicare con l'API profiler. Per risolvere questo errore, aggiungi il seguente comando apk
al tuo Dockerfile:
FROM alpine
...
RUN apk add --no-cache ca-certificates
Devi quindi ricostruire e eseguire nuovamente il deployment dell'applicazione.
Passaggi successivi
- Seleziona i profili da analizzare
- Interagire con il grafico a fiamme
- Filtrare il grafico a fiamme
- Mettere a fuoco il grafico a fiamme
- Confrontare i profili