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:

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 con musl. Per informazioni di configurazione specifiche per i kernel Linux Alpine, consulta In esecuzione su Linux Alpine.

Ambienti supportati:

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

  1. 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.

  2. Esegui questo comando:

    gcloud services enable cloudprofiler.googleapis.com
    

Per ulteriori informazioni, consulta gcloud services.

Cloud Console

  1. Vai alla dashboard API e servizi:

    Vai ad API e servizi

  2. Seleziona il progetto che utilizzerai per accedere all'API.

  3. Fai clic sul pulsante Aggiungi API e servizi.

    Aggiungi API e servizi

  4. Cerca l'API Profiler.

  5. Nei risultati di ricerca, seleziona API Cloud Profiler.

    Se non vedi l'API Cloud Profiler, seleziona l'API Stackdriver Profiler.

  6. 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:


// snippets is an example of starting cloud.google.com/go/profiler.
package main

import (
	"cloud.google.com/go/profiler"
)

func main() {
	cfg := profiler.Config{
		Service:        "myservice",
		ServiceVersion: "1.0.0",
		// ProjectID must be set if not running on GCP.
		// ProjectID: "my-project",

		// For OpenCensus users:
		// To see Profiler agent spans in APM backend,
		// set EnableOCTelemetry to true
		// EnableOCTelemetry: true,
	}

	// Profiler initialization, best done as early as possible.
	if err := profiler.Start(cfg); err != nil {
		// TODO: Handle error.
	}
}

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:


// snippets is an example of starting cloud.google.com/go/profiler.
package main

import (
	"cloud.google.com/go/profiler"
)

func main() {
	cfg := profiler.Config{
		Service:        "myservice",
		ServiceVersion: "1.0.0",
		// ProjectID must be set if not running on GCP.
		// ProjectID: "my-project",

		// For OpenCensus users:
		// To see Profiler agent spans in APM backend,
		// set EnableOCTelemetry to true
		// EnableOCTelemetry: true,
	}

	// Profiler initialization, best done as early as possible.
	if err := profiler.Start(cfg); err != nil {
		// TODO: Handle error.
	}
}

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.


// appengine is an example of starting cloud.google.com/go/profiler on
// App Engine.
package main

import (
	"cloud.google.com/go/profiler"
)

func main() {
	// Profiler initialization, best done as early as possible.
	if err := profiler.Start(profiler.Config{
		// Service and ServiceVersion can be automatically inferred when running
		// on App Engine.
		// ProjectID must be set if not running on GCP.
		// ProjectID: "my-project",
	}); err != nil {
		// TODO: Handle error.
	}
}

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:

  1. Aggiorna le dipendenze:

    go get cloud.google.com/go/profiler
    
  2. 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 essere main/app.yaml.

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 a
signal.Notify(make(
chan os.Signal), syscall.SIGPROF)
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: