Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Profilazione delle applicazioni Go

In questa pagina viene descritto come modificare l'applicazione Go per acquisire i dati di profilazione e far sì che vengano inviati al tuo progetto Google Cloud. Per informazioni generali sulla profilazione, consulta Concetti di profilazione.

Tipi di profilo per Go:

  • Tempo CPU
  • Heap
  • Heap allocato
  • Contestazione (disattiva audio)
  • Thread (go gotine)

Versioni di lingua di Go supportate:

Versioni supportate per l'agente di profilazione:

  • È supportata la release più recente dell'agente. In generale, le release che risalgono a più di un anno fa 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 sottostante sia abilitata. Puoi controllare lo stato dell'API e abilitarla, se necessario, utilizzando Google Cloud CLI o Google Cloud Console:

Interfaccia a riga di comando gcloud

  1. Se non hai ancora installato Google Cloud CLI sulla tua workstation, consulta la documentazione di Google Cloud CLI.

  2. Esegui questo comando:

    gcloud services enable cloudprofiler.googleapis.com
    

Per maggiori informazioni, consulta gcloud services.

console Google Cloud

  1. Vai alla dashboard API e servizi:

    Vai a 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 API Profiler.

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

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

  6. Se viene visualizzata l'opzione 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 inizializzandolo il prima possibile nell'applicazione.

Puoi attivare la profilazione delle contenezioni audio disattivato ("Contestazione" 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 sull'API.

Compute Engine

Per Compute Engine, in profiler.Config imposta Service con un nome per il servizio di profilo 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 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 di profilo 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 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, le aggiunte di codice sono quasi identiche a quelle di Compute Engine e GKE. C'è un'eccezione. In entrambi gli ambienti App Engine, i parametri Service e ServiceVersion vengono derivati 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 in locale, 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 è necessario impostare ServiceVersion.

Se utilizzi l'ambiente standard di App Engine, consulta la pagina sulla migrazione dell'app alla versione 1.11 per informazioni dettagliate sulle modifiche che potrebbero essere apportate all'applicazione. Inoltre, devi utilizzare Google Cloud CLI 226.0.0 o versioni successive. Per aggiornare Google Cloud CLI, esegui questo comando:

    gcloud components update

Per eseguire l'applicazione:

  1. Aggiorna le dipendenze:

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

Analisi dei dati

Dopo che Profiler ha raccolto i dati, puoi visualizzare e analizzare questi dati utilizzando l'interfaccia di Profiler. Per iniziare a utilizzare questa interfaccia, consulta la sezione Apertura dell'interfaccia di Profiler.

Nome del servizio e argomenti della versione

Quando carichi l'agente Profiler, devi specificare un argomento del nome del servizio e un argomento facoltativo della versione del servizio 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 ogni nome di servizio in ogni versione e zona del servizio combinata.

Ad esempio, se hai un servizio con due versioni in esecuzione tra le repliche in tre zone, il profiler creerà una media di 6 profili al minuto per quel servizio.

Se utilizzi nomi di servizi diversi per le tue repliche, il servizio verrà profilato più spesso del necessario, con un sovraccarico corrispondente di conseguenza.

Quando selezioni il nome di un servizio:

  • Scegli un nome che rappresenti chiaramente il servizio nella struttura dell'applicazione. La scelta del nome del servizio è meno importante se esegui un solo servizio o applicazione. Ad esempio, è più importante se la tua applicazione viene eseguita come un insieme di microservizi.

  • Assicurati di non utilizzare valori specifici per il processo, come 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])?$

È buona norma 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 utilizzata per contrassegnare versioni diverse dei servizi durante il deployment. L'interfaccia utente di Profiler 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 della versione del servizio è una stringa in formato libero, ma i valori di 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 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});

Risolvere i problemi

In questa sezione vengono elencati i problemi specifici della profilazione delle applicazioni Go. Per risolvere i problemi comuni, consulta la pagina 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 profili di 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.

Esecuzione 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 (come 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"

Nota che per visualizzare l'errore è necessario che il logging dell'agente sia abilitato. Per impostazione predefinita, l'agente di 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. Tali certificati sono necessari affinché l'agente di profilazione comunichi con l'API Profiler. Per risolvere questo errore, aggiungi il seguente comando apk al Dockerfile:

FROM alpine
...
RUN apk add --no-cache ca-certificates

quindi dovrai ricreare e rieseguire il deployment dell'applicazione.

Passaggi successivi

Per saperne di più sul grafico e sui controlli di Profiler, consulta Utilizzo dell'interfaccia di Cloud Profiler. Per informazioni avanzate, consulta quanto segue: