Profilazione delle applicazioni Go
In questa pagina viene descritto come modificare l'applicazione Go per acquisire dati di profilazione e inviarli al tuo progetto Google Cloud. Per informazioni generali sulla profilazione, consulta la sezione Concetti di profilazione.
Tipi di profili per Go:
- Tempo CPU
- Heap
- Heap allocato
- Contestazione (Go mutex)
- Thread (Goroutine)
Versioni supportate della lingua Go:
- Tutte le release di Go ufficialmente gestite, se non diversamente specificato. Per ulteriori informazioni, consulta le norme relative al rilascio di lingua.
Versioni dell'agente di profilazione supportate:
- È supportata la release più recente dell'agente. In generale, le release precedenti a un anno non sono supportate. Ti consigliamo di utilizzare la versione 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 di configurazione specifiche per i kernel Linux Alpine, consulta In 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, vedi Profilazione delle applicazioni in esecuzione all'esterno di Google Cloud).
Abilitazione dell'API Profiler
Prima di utilizzare l'agente di profilazione, assicurati che l'API Profiler sia attiva. Puoi controllare lo stato dell'API e abilitarla, se necessario, utilizzando l'interfaccia a riga di comando di Google Cloud o Google Cloud Console:
Interfaccia a riga di comando gcloud
Se non hai già installato l'interfaccia a riga di comando di Google Cloud sulla workstation, consulta la documentazione sull'interfaccia a riga di comando di Google Cloud.
Esegui questo comando:
gcloud services enable cloudprofiler.googleapis.com
Per ulteriori informazioni, consulta
gcloud services
.
Cloud Console
Vai alla dashboard API e servizi:
Seleziona il progetto che utilizzerai per accedere all'API.
Fai clic sul pulsante Aggiungi API e servizi.
Cerca l'API Profiler.
Nei risultati di ricerca, seleziona API Cloud Profiler.
Se non vedi l'API Cloud Profiler, seleziona l'API Stackdriver Profiler.
Se è visualizzata l'opzione API abilitata, 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 inizializzandolo il prima possibile nell'applicazione.
Puoi attivare la profilazione della combinazione di contenuti disattivati (Contention 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 personalizzare e, facoltativamente, imposta ServiceVersion
con
la versione del servizio:
Se nel codice sorgente sono presenti dipendenze recuperate manualmente, potresti dover aggiungere quanto segue al tuo script o al Dockerfile di build:
go get cloud.google.com/go/profiler
GKE
Per GKE, in profiler.Config
imposta Service
con un
nome per il servizio da descrivere e, facoltativamente, imposta ServiceVersion
con
la versione del servizio:
Se nel codice sorgente sono presenti dipendenze recuperate manualmente, potresti dover aggiungere quanto segue al tuo script o al Dockerfile di build:
go get cloud.google.com/go/profiler
App Engine
Per l'ambiente flessibile di App Engine e l'ambiente standard di App Engine, le aggiunte di codice sono quasi identiche a quelle 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 localmente, imposta i parametri ProjectID
(ID del tuo progetto Google Cloud) e Service
in profiler.Config
, poiché non possono essere ricavati da un ambiente locale. Non devi impostare
ServiceVersion
.
Se utilizzi l'ambiente standard di App Engine, consulta la sezione Migrazione dell'app a Go 1.11 per informazioni dettagliate sulle modifiche che potresti dover apportare all'applicazione. Inoltre, devi utilizzare l'interfaccia a riga di comando di Google Cloud versione 226.0.0 o successiva. Per aggiornare l'interfaccia a riga di comando di Google Cloud, esegui il comando seguente:
gcloud components update
Per eseguire l'applicazione:
Aggiorna le dipendenze:
go get cloud.google.com/go/profiler
Esegui il deployment dell'applicazione nel tuo ambiente flessibile App Engine o nel tuo ambiente standard App Engine:
gcloud app deploy [DEPLOYMENT]
dove
DEPLOYMENT
è il percorso del tuo file di configurazione. Ad esempio,DEPLOYMENT
potrebbe esseremain/app.yaml
.- Per i dettagli sul deployment dell'ambiente flessibile di App Engine, vedi Test e deployment dell'applicazione.
- Per i dettagli sul deployment dell'ambiente standard di App Engine, vedi Test e deployment dell'applicazione.
Analisi dei dati
Dopo aver raccolto dati, Profiler può visualizzare e analizzare questi dati utilizzando l'interfaccia di Profiler. Per iniziare a utilizzare questa interfaccia, consulta la pagina Apertura dell'interfaccia di Profiler.
Argomenti del nome e della versione del servizio
Quando carichi l'agente Profiler, devi specificare un argomento del nome servizio e un argomento facoltativo della versione servizio per configurarlo.
Il nome del servizio consente a Profiler di raccogliere i dati di profilazione per tutte le repliche del servizio. Il servizio profiler garantisce una frequenza di raccolta di un profilo al minuto, in media, per ogni nome di servizio in ogni versione e zona del servizio combinata.
Ad esempio, se utilizzi un servizio con due versioni in esecuzione in più repliche in tre zone, il profiler creerà una media di sei profili al minuto per quel servizio.
Se utilizzi nomi di servizio diversi per le tue repliche, il servizio verrà profilo più spesso del necessario, con un sovraccarico di conseguenza superiore.
Quando selezioni il nome di un servizio:
Scegli un nome che rappresenti chiaramente il servizio nella tua architettura dell'applicazione. La scelta del nome del servizio è meno importante se esegui un solo servizio o una sola applicazione. È più importante se la tua applicazione viene eseguita, ad esempio, come un insieme di microservizi.
Assicurati di non utilizzare valori specifici per il processo, ad esempio un ID processo, nella stringa del nome del servizio.
La stringa nome-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 da più istanze e visualizzarle correttamente. Può essere utilizzato per contrassegnare versioni diverse dei servizi durante l'implementazione. La UI di Profiler ti consente di filtrare i dati in base alla versione del servizio; in questo modo puoi confrontare le prestazioni delle versioni precedenti e più recenti del codice.
Il valore dell'argomento relativo alla versione del servizio è una stringa in formato libero, ma i valori per questo argomento in genere sono simili ai 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 propri log. Per impostazione predefinita, il logging degli agenti è disabilitato.
Per abilitare il logging degli agenti,
imposta l'opzione DebugLogging
su true
all'avvio dell'agente:
profiler.Start(profiler.Config{..., DebugLogging: true});
Risolvere i problemi
In questa sezione sono elencati i problemi specifici relativi alla profilazione delle applicazioni Go. Consulta la sezione Risoluzione dei problemi per risolvere i problemi comuni.
Comportamento | Causa | Soluzione |
---|---|---|
I profili di tempo della CPU non vengono raccolti per le applicazioni create con -buildmode=c-archive . Vengono raccolti profili heap, contese e
thread.
Problema di 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 di GitHub. |
Corsa con Linux Alpine
L'agente di profilazione Go per Linux Alpine è supportato solo per le configurazioni di Google Kubernetes Engine.
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 è necessario che sia abilitato il logging degli agenti. Per impostazione predefinita, l'agente per Go non restituisce alcun messaggio di log.
L'errore indica che per le immagini Docker con Linux Alpine non sono installati i certificati SSL radice per impostazione predefinita. Questi certificati sono necessari per
consentire all'agente di profilazione di comunicare con l'API del profiler. Per risolvere questo errore, aggiungi il seguente comando apk
al Dockerfile:
FROM alpine
...
RUN apk add --no-cache ca-certificates
Dovrai quindi ricreare e sottoporre nuovamente a deployment l'applicazione.
Passaggi successivi
Per informazioni sul grafico e sui controlli di Profiler, consulta Utilizzo dell'interfaccia di Cloud Profiler. Per informazioni avanzate, consulta:
- Selezionare i profili da analizzare
- Interazione con il grafico a fiamme
- Filtrare il grafico a fiamme
- Mettere a fuoco il grafico a fiamme
- Confronto dei profili