Profilazione delle applicazioni Python

Questa pagina descrive come modificare l'applicazione Python per acquisire profilazione dei dati e l'invio di questi dati al tuo account Google Cloud progetto. Per informazioni generali sulla profilazione, consulta Concetti di profilazione.

Tipi di profilo per Python:

  • Tempo CPU
  • Tempo totale di esecuzione (thread principale)

Versioni del linguaggio Python supportate:

  • Python 3.6 o superiore.

Versioni dell'agente di profilazione supportate:

  • È supportata la release più recente dell'agente. In generale, le release meno recenti oltre un anno non sono supportate. Ti consigliamo di utilizzare una versione rilasciata di recente dell'agente.

Sistemi operativi supportati:

  • Linux. La profilazione delle applicazioni Python è supportata per i kernel Linux la cui libreria C standard è implementata con glibc o con musl. Per per la configurazione specifiche dei kernel alpini di Linux, vedi In esecuzione su Linux Alps.

Ambienti supportati:

Abilitazione dell'API Profiler

Prima di utilizzare l'agente di profilazione, assicurati che l'elemento sottostante L'API Profiler è abilitata. Puoi controllare lo stato dell'API e abilitare e, se necessario, utilizzando Google Cloud CLI la console Google Cloud:

Interfaccia a riga di comando gcloud

  1. Se non hai già installato Google Cloud CLI sul tuo consulta la documentazione di Google Cloud CLI.

  2. Esegui questo comando:

    gcloud services enable cloudprofiler.googleapis.com
    

Per ulteriori informazioni, vedi gcloud services.

Console Google Cloud

  1. Attiva l'API richiesta.

    Abilita l'API

  2. Se viene visualizzato API abilitata, l'API è già abilitata. In caso contrario, fai clic sul pulsante Attiva.

Utilizzo di Cloud Profiler

Per le best practice relative all'utilizzo di Python, vai a Impostazione di un ambiente di sviluppo Python.

Compute Engine

Per Compute Engine, segui questi passaggi:

  1. Installa il compilatore C/C++ e gli strumenti di sviluppo:

    sudo apt-get install -y build-essential
    
  2. Installa pip:

    sudo apt-get install -y python3-pip
    
  3. Installa il pacchetto Profiler:

    pip3 install google-cloud-profiler
    
  4. Importa il modulo googlecloudprofiler e richiamare la funzione googlecloudprofiler.start il prima possibile nel codice di inizializzazione:

    import googlecloudprofiler
    
    
    def main():
        # Profiler initialization. It starts a daemon thread which continuously
        # collects and uploads profiles. Best done as early as possible.
        try:
            googlecloudprofiler.start(
                service="hello-profiler",
                service_version="1.0.1",
                # verbose is the logging level. 0-error, 1-warning, 2-info,
                # 3-debug. It defaults to 0 (error) if not set.
                verbose=3,
                # project_id must be set if not running on GCP.
                # project_id='my-project-id',
            )
        except (ValueError, NotImplementedError) as exc:
            print(exc)  # Handle errors here

    Devi specificare il parametro service nella funzione start. A filtrando in base alla versione dell'applicazione nel profiler specifica il parametro service_version. Per informazioni sulla risoluzione dei problemi e sulle eccezioni, consulta la sezione Risoluzione dei problemi.

GKE

Per GKE, segui questi passaggi:

  1. Modifica il tuo Dockerfile per installare il pacchetto Profiler:

    FROM python:3
    ...
    RUN apt-get update && apt-get install -y build-essential python3-pip
    RUN pip3 install google-cloud-profiler
    
  2. Importa il modulo googlecloudprofiler e richiamare la funzione googlecloudprofiler.start il prima possibile nel codice di inizializzazione:

    import googlecloudprofiler
    
    
    def main():
        # Profiler initialization. It starts a daemon thread which continuously
        # collects and uploads profiles. Best done as early as possible.
        try:
            googlecloudprofiler.start(
                service="hello-profiler",
                service_version="1.0.1",
                # verbose is the logging level. 0-error, 1-warning, 2-info,
                # 3-debug. It defaults to 0 (error) if not set.
                verbose=3,
                # project_id must be set if not running on GCP.
                # project_id='my-project-id',
            )
        except (ValueError, NotImplementedError) as exc:
            print(exc)  # Handle errors here

    Devi specificare il parametro service nella funzione start. A filtrando in base alla versione dell'applicazione nel profiler specifica il parametro service_version. Per informazioni sulla risoluzione dei problemi e sulle eccezioni, consulta la sezione Risoluzione dei problemi.

Ambiente flessibile

Per l'ambiente flessibile di App Engine, segui questi passaggi:

  1. Aggiungi google-cloud-profiler al tuo file requirements.txt.

  2. Importa il modulo googlecloudprofiler e richiamare la funzione googlecloudprofiler.start il prima possibile nel codice di inizializzazione.

Per App Engine, i valori service e service_version sono derivati dal tuo ambiente operativo. Per informazioni sulla risoluzione dei problemi e sulle eccezioni, consulta Risoluzione dei problemi.

Ambiente standard

Per l'ambiente standard App Engine, che richiede l'uso del nell'ambiente di runtime Python 3, segui questi passaggi:

  1. Aggiungi google-cloud-profiler al tuo file requirements.txt.

  2. Importa il modulo googlecloudprofiler e richiamare la funzione googlecloudprofiler.start il prima possibile nel codice di inizializzazione.

Per App Engine, i valori service e service_version sono derivati dal tuo ambiente operativo. Per informazioni sulla risoluzione dei problemi e sulle eccezioni, consulta la sezione Risoluzione dei problemi.

start funzione

La funzione googlecloudprofiler.start crea un thread daemon che raccoglie e carica continuamente i profili. Dovresti chiama start una volta e il prima possibile nella tua domanda.

Parametro Descrizione
service1 (Obbligatorio) Il nome del servizio che viene profilato. Per limitazioni sul nome del servizio, vedi Argomenti Nome servizio e versione.
service_version1 (Facoltativo) La versione del servizio che viene profilato. Per limitazioni sulla versione del servizio, vedi Argomenti Nome servizio e versione.
verbose (Facoltativo) Il livello di logging. Per maggiori dettagli sul dei livelli di logging, consulta Logging agente.

Il valore predefinito è 0 (errore).
project_id2 (Facoltativo) Il tuo ID progetto Google Cloud.
disable_cpu_profiling (Facoltativo) Per disattivare la profilazione del tempo di CPU, imposta disable_cpu_profiling=True.

Questo parametro è supportato solo per Python versione 3.2 e successive. Per tutti gli altri modelli Python versioni successive, la profilazione del tempo di CPU non è supportata e questo parametro ignorato.

Il valore predefinito è False.
disable_wall_profiling (Facoltativo) Per disattivare la profilazione del wall, imposta disable_wall_profiling=True.

Questo parametro è supportato per Python 3.6 e versioni successive. Per tutti gli altri modelli Python versioni successive, la profilazione del wall non è supportata e questo parametro viene ignorato.

Per limitazioni relative alla funzione start durante la profilazione del muro sia attiva, consulta la sezione Limitazioni.

Il valore predefinito è False.

1 Solo per Compute Engine e GKE. Per App Engine, il valore deriva da dell'ambiente.
2 Per Google Cloud, il valore deriva da dell'ambiente. Per gli ambienti non Google Cloud, devi fornire un valore. Per informazioni, vedi Profilazione delle applicazioni in esecuzione al di fuori di Google Cloud.

Analisi dei dati

Dopo che Profiler ha raccolto i dati, puoi visualizzare e analizzare questi dati utilizzando l'interfaccia Profiler.

Nella console Google Cloud, vai alla pagina Profiler:

Vai a Profiler

Puoi trovare questa pagina anche utilizzando la barra di ricerca.

Argomenti per nome e versione del servizio

Quando carichi l'agente Profiler, specifichi un argomento service-name e un un argomento facoltativo service-version per configurarlo.

Il nome del servizio consente a Profiler di raccogliere dati di profilazione per tutti di repliche di quel servizio. Il servizio profiler garantisce tasso di raccolta di un profilo al minuto, in media, per ogni servizio in ogni combinazione di versioni e zone del servizio.

Ad esempio, se hai un servizio con due versioni in esecuzione di 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 essere profilati più spesso del necessario, con un overhead di conseguenza più elevato.

Quando selezioni il nome di un servizio:

  • Scegli un nome che rappresenti chiaramente il servizio nella tua applicazione dell'architettura. La scelta del nome del servizio è meno importante se esegui solo un singolo servizio o una singola applicazione. È più importante che la tua applicazione viene eseguito come un insieme di microservizi, ad esempio.

  • Assicurati di non utilizzare valori specifici per il processo, ad esempio un ID processo, nella stringa service-name.

  • 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 è usare una stringa statica come imageproc-service come il nome del servizio.

La versione del servizio è facoltativa. Se specifichi la versione del servizio, Profiler può aggregare le informazioni di profilazione da più le istanze VM e visualizzarle correttamente. Può essere usato per contrassegnare versioni diverse dei servizi durante il loro deployment. La UI di Profiler ti consente filtrare i dati in base alla versione del servizio; In questo modo, puoi confrontare il rendimento delle versioni più vecchie e più recenti del codice.

Il valore dell'argomento service-version è una stringa in formato libero, ma valori per questo argomento generalmente sono i numeri di versione, ad esempio 1.0.0 o 2.1.2.

Logging agente

Per impostazione predefinita, l'agente di profilazione registra i messaggi con un livello di gravità pari a error. Per configurare l'agente in modo che registri i messaggi con livelli di gravità più bassi, specificare il parametro verbose all'avvio dell'agente. Per verbose sono supportati quattro valori:

  • 0 : errore
  • 1 : avviso
  • 2 : informativa
  • 3 : debug

Se imposti il parametro verbose su 1 nella chiamata su start, i messaggi con un livello di gravità pari a Warning o Error vengono registrati, mentre Informational e Debug messaggi vengono ignorati.

Per registrare tutti i messaggi, imposta verbose su 3 all'avvio dell'agente:

googlecloudprofiler.start(service='service_name', verbose=3)

Risoluzione dei problemi

Questa sezione elenca limitazioni, eccezioni e problemi noti specifici alla profilazione delle applicazioni Python. Consulta la sezione Risoluzione dei problemi. per ricevere assistenza in merito a problemi comuni.

Limitazioni

Tipo di profilo Restrizioni e limitazioni
Tempo totale di esecuzione
  • Solo profilazione del thread principale.
  • La funzione del profilo start deve essere chiamata dal thread principale.
  • Il gestore di indicatori Profiler viene eseguito solo nel thread principale. Se il thread principale non può essere eseguito, nessuna profilazione l'acquisizione dei dati.

Eccezioni

Errore Causa Soluzione
NotImplementedError lanciata durante start Applicazione eseguita in un ambiente non Linux.
  • Esegui la tua applicazione in un ambiente Linux.
ValueError lanciata durante start Gli argomenti della funzione start non sono validi e sono necessari informazioni non possono essere determinate dalle variabili di ambiente argomenti o profilazione se sia la profilazione del tempo di CPU che il tempo di esecuzione la profilazione è disabilitata.
  • Assicurati che il nome e la versione del servizio soddisfino i requisiti definiti in Argomenti Nome servizio e versione.
  • Se la profilazione del wall è attiva, assicurati che start viene chiamato dal thread principale.
  • Assicurati di utilizzare una versione supportata di Python che la profilazione del tempo di CPU o del tempo di esecuzione sia attiva. Per ulteriori informazioni le informazioni, vedi Funzione start.
  • Verifica di aver specificato il project_id su start se stai eseguendo l'esecuzione al di fuori di in Google Cloud. Per ulteriori informazioni, vedi Funzione start.

Problemi noti

Comportamento Causa Soluzione
Non sono presenti dati del profilo oppure hai attivato un nuovo profilo e mancano i dati del profilo. Le cause più comuni sono legate alla configurazione. Consulta la sezione Risoluzione dei problemi.
Stai utilizzando uWSGI e non hai tempo di CPU e dati del profilo Wall per tutti i processi.

Quando uWSGI utilizza più worker per gestire le richieste, il valore predefinito è eseguire l'inizializzazione dell'applicazione solo il processo principale ("master"). I processi creati con fork non eseguono sequenza di inizializzazione.

Se configurare l'agente di profilazione nell'inizializzazione dell'applicazione sequenza, ad esempio, in AppConfig.ready() in una l'applicazione Django, l'effetto è che l'agente di profilazione non è configurata per i processi creati con fork.

Per eseguire l'inizializzazione dell'applicazione in tutti i processi worker, imposta la bandiera app-pirate a true.

Consulta l'argomento successivo di questa tabella per un problema correlato.

Stai utilizzando uWSGI e non hai dati del profilo Wall, ma hai tempo di CPU dei dati del profilo.

Il profiler a parete dipende dal modulo del segnale Python. Quando l'interprete Python viene compilato con il supporto dei thread, la configurazione predefinita disattiva la gestione degli indicatori personalizzati per i fork i processi di machine learning.

Per le applicazioni uWSGI, abilita la gestione personalizzata del segnale l'impostazione del flag py-call-osafterfork a true.

Consulta l'argomento precedente di questa tabella per un problema correlato.

Dopo aver abilitato il profiler, il log degli errori contiene nuove voci:

BlockingIOError: [Errno 11] Resource temporarily unavailable Exception ignored when trying to write to the signal wakeup fd

Problema di GitHub

L'applicazione è stata registrata con il descrittore del file di attivazione del segnale. signal.set_wakeup_fd. Per impostazione predefinita, se il buffer del descrittore del file si riempie, viene visualizzato un avviso registrato in stderr.

Quando Cloud Profiler raccoglie i profili, attiva gli indicatori con alta frequenza. Questo comportamento può causare la presenza di un buffer del descrittore del file la pienezza.

Se l'applicazione può essere eseguita in modo sicuro quando vengono persi segnali, puoi utilizzare Cloud Profiler. Se usi Python 3.7, o in un secondo momento e vuoi disattivare i messaggi di avviso, quindi warn_on_full_buffer=False parametro signal.set_wakeup_fd.

Se l'applicazione non può essere eseguita in modo sicuro quando vengono persi gli indicatori, ti consigliamo di interrompere l'utilizzo di Cloud Profiler. L'uso continuato potrebbe causare la perdita dei numeri di indicatori e un uso eccessivo nel log degli errori.

Esecuzione con Linux alpino

L'agente di profilazione Python per Linux Alps è supportato solo per configurazioni di Google Kubernetes Engine.

Per creare l'agente di profilazione Python, devi installare il pacchetto build-base. Per utilizzare l'agente di profilazione Python su Alpine senza installare altri delle dipendenze all'immagine alpina finale, puoi usare una build in due fasi l'agente di profilazione Python nella prima fase. Ad esempio, la seguente immagine Docker utilizza una build a più fasi per compilare e installa l'agente di profilazione Python:

FROM python:3.7-alpine as builder

# Install build-base to allow for compilation of the profiling agent.
RUN apk add --update --no-cache build-base

# Compile the profiling agent, generating wheels for it.
RUN pip3 wheel --wheel-dir=/tmp/wheels google-cloud-profiler


FROM python:3.7-alpine

# Copy over the directory containing wheels for the profiling agent.
COPY --from=builder /tmp/wheels /tmp/wheels

# Install the profiling agent.
RUN pip3 install --no-index --find-links=/tmp/wheels google-cloud-profiler

# Install any other required modules or dependencies, and copy an app which
# enables the profiler as described in "Enable the profiler in your
# application".
COPY ./bench.py .

# Run the application when the docker image is run, using either CMD (as is done
# here) or ENTRYPOINT.
CMD python3 -u bench.py

Errore di autenticazione

Se utilizzi immagini Docker eseguite con Linux alpino (ad es. golang:alpine o solo alpine), potrebbe essere visualizzato 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 dell'agente.

L'errore indica che le immagini Docker con Linux Alpine non hanno certificati SSL radice installati per impostazione predefinita. Questi certificati sono necessari per l'agente di profilazione per comunicare con l'API profiler. Da risolvere questo errore, aggiungi il seguente comando apk al tuo Dockerfile:

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

Devi quindi ricreare la build ed eseguire nuovamente il deployment dell'applicazione.

Passaggi successivi