Profilazione delle applicazioni Go
In questa pagina viene descritto 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
- Contesa (Go mutex)
- Thread (Goroutine)
Versioni lingue di Go supportate:
- Tutte le release Go mantenute ufficialmente, se non diversamente specificato. Per maggiori informazioni, consulta le norme di rilascio per le lingue Go.
Versioni dell'agente di profilazione supportate:
- È supportata la release più recente dell'agente. In genere, le release che risalgono a più di un anno fa non sono supportate. Ti consigliamo di utilizzare la versione rilasciata più recente dell'agente.
Sistemi operativi supportati:
- Linux. La profilazione delle applicazioni Go è supportata per i kernel Linux la cui libreria C standard è implementata con
glibc
o conmusl
. Per informazioni sulla configurazione specifiche per i kernel Alpine di Linux, 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 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'API Profiler sottostante sia abilitata. Puoi controllare lo stato dell'API e abilitarla, se necessario, utilizzando Google Cloud CLI o la console Google Cloud:
Interfaccia a riga di comando gcloud
Se non hai già installato Google Cloud CLI sulla tua workstation, consulta la documentazione di Google Cloud CLI.
Esegui questo comando:
gcloud services enable cloudprofiler.googleapis.com
Per maggiori informazioni, consulta
gcloud services
.
Console Google Cloud
-
Nel pannello di navigazione della console Google Cloud, seleziona API e servizi, fai clic su Abilita API e servizi e poi abilita l'API Cloud Profiler:
Se viene visualizzato API abilitata, significa che l'API è già abilitata. In caso contrario, fai clic sul pulsante Attiva.
Utilizzo di Cloud Profiler
In tutti gli ambienti supportati, puoi utilizzare Profiler importando il pacchetto nell'applicazione e quindi inizializzandolo il prima possibile nell'applicazione.
Puoi attivare la profilazione di mutox-contenuto ("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 pubblica dell'API.
Compute Engine
Per Compute Engine, in profiler.Config
imposta Service
con un nome per il servizio da profilare e, facoltativamente, imposta ServiceVersion
con la versione del servizio:
Se nel tuo codice sorgente sono presenti dipendenze che vengono recuperate manualmente, potresti dover aggiungere quanto segue allo script di build o al Dockerfile:
go get cloud.google.com/go/profiler
GKE
Per GKE, in profiler.Config
imposta Service
con un
nome per il servizio da profilare e, facoltativamente, imposta ServiceVersion
con
la versione del servizio:
Se nel tuo codice sorgente sono presenti dipendenze che vengono recuperate manualmente, potresti dover aggiungere quanto segue allo script di build o al Dockerfile:
go get cloud.google.com/go/profiler
App Engine
Per l'ambiente flessibile di App Engine e l'ambiente standard di App Engine, l'aggiunta di codice è quasi identica a quella per Compute Engine e GKE.
C'è un'eccezione. In entrambi gli ambienti App Engine, i parametri Service
e ServiceVersion
derivano dall'ambiente, quindi non è necessario specificarli.
Quando esegui l'applicazione in locale, imposta i parametri ProjectID
(l'ID del progetto Google Cloud) e Service
in profiler.Config
, dato che non possono essere ricavati da un ambiente locale. Non è necessario impostare
ServiceVersion
.
Se utilizzi l'ambiente standard di App Engine, consulta Migrazione dell'app a Go 1.11 per informazioni dettagliate sulle modifiche che potresti dover apportare all'applicazione. Inoltre, devi utilizzare Google Cloud CLI versione 226.0.0 o successive. Per aggiornare Google Cloud CLI, esegui questo 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 dell'ambiente flessibile di App Engine, consulta Test e deployment dell'applicazione.
- Per maggiori dettagli sul deployment dell'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.
Nel pannello di navigazione della console Google Cloud, seleziona Profiler:
Argomenti della versione e del nome del servizio
Quando carichi l'agente Profiler, devi specificare 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 di quel servizio. Il servizio profiler garantisce una frequenza di raccolta di un profilo al minuto, in media, per ciascun nome di servizio in ogni combinazione di versioni e zone di servizio.
Ad esempio, se hai un servizio con due versioni in esecuzione su 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 verrà profilato più spesso del necessario, con un overhead corrispondentemente maggiore.
Quando selezioni il nome di un 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 una singola applicazione. Ad esempio, è più importante se l'applicazione viene eseguita come un insieme di micro-servizi.
Assicurati di non utilizzare valori specifici del processo, come un ID processo, nella stringa del nome del servizio.
La stringa del nome del servizio deve corrispondere alla seguente espressione regolare:
^[a-z0-9]([-a-z0-9_.]{0,253}[a-z0-9])?$
Una buona linea guida è quella di 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 da più istanze e visualizzarle correttamente. Può essere usata per contrassegnare le diverse versioni dei servizi man mano che ne viene eseguito il deployment. L'interfaccia utente di Profiler ti consente di filtrare i dati in base alla versione del servizio, in modo da confrontare le prestazioni delle versioni precedenti e più recenti del codice.
Il valore dell'argomento service-version è una stringa in formato libero, ma i valori per questo argomento solitamente sono come numeri di versione, ad esempio 1.0.0
o 2.1.2
.
Logging degli agenti
L'agente di profilazione può segnalare le informazioni di debug nei propri log. Per impostazione predefinita, il logging degli agenti è disabilitato.
Per abilitare il logging dell'agente, imposta l'opzione DebugLogging
su true
all'avvio dell'agente:
profiler.Start(profiler.Config{..., DebugLogging: true});
Risoluzione dei problemi
In questa sezione sono elencati i problemi specifici delle applicazioni Go di profilazione. Per assistenza in caso di problemi comuni, consulta la sezione Risoluzione dei problemi.
Comportamento | Causa | Soluzione |
---|---|---|
I profili del tempo di CPU non vengono raccolti per le applicazioni create con
-buildmode=c-archive . Vengono raccolti profili heap, contesi e thread.
Problema relativo a GitHub
|
Per impostazione predefinita, la profilazione della CPU non è abilitata per le applicazioni Go quando il flag -buildmode è c-archive o c-shared . |
Aggiungi una chiamata asignal.Notify(make(
prima di chiamare profiler.Start .Risposta al problema 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 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 avere abilitato il logging degli agenti. Per impostazione predefinita, l'agente per Go non restituisce alcun messaggio di log.
L'errore indica che nelle immagini Docker con Linux Alpine non sono installati i certificati SSL radice per impostazione predefinita. Questi certificati sono necessari affinché l'agente di profilazione comunichi con l'API Profiler. Per risolvere questo errore, aggiungi il comando apk
seguente al tuo Dockerfile:
FROM alpine
...
RUN apk add --no-cache ca-certificates
Poi devi ricreare l'applicazione ed eseguirne nuovamente il deployment.
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