Concetti di profilazione

La profilazione è una forma di analisi del codice dinamico. Puoi acquisire le caratteristiche dell'applicazione durante l'esecuzione e poi utilizzare queste informazioni per identificare come rendere l'applicazione più veloce ed efficiente.

In passato, la profilazione veniva eseguita solo durante lo sviluppo dell'applicazione. Questo approccio si basava sulla capacità di sviluppare test di carico e benchmark in grado di prevedere con precisione un ambiente di produzione.

La profilazione continua si riferisce alla profilazione dell'applicazione durante l'esecuzione in un ambiente di produzione. Questo approccio riduce la necessità di sviluppare test di carico predittivo e benchmark accurati per l'ambiente di produzione. La ricerca sulla profilazione continua ha dimostrato che è accurata e conveniente*.

Cloud Profiler è uno strumento di profilazione continua, progettato per le applicazioni in esecuzione su Google Cloud:

  • È un profiler statistico, o di campionamento, con overhead ridotto ed è adatto agli ambienti di produzione.

  • Supporta lingue comuni e raccoglie più tipi di profilo. Per una panoramica, consulta Tipi di profilazione disponibili.

La configurazione di un'applicazione Google Cloud per generare dati del profilo è un semplice processo una tantum: collegare o eseguire il servizio con un agente di profilazione incluso. Dopo il deployment dell'applicazione, l'agente di profilazione viene eseguito periodicamente per raccogliere i dati sulle prestazioni, quindi li invia al progetto Google Cloud. Per maggiori dettagli su questa procedura, consulta Raccolta del profilo.

Dopo aver raccolto i dati del profilo per la tua applicazione, puoi analizzarli utilizzando l'interfaccia di Profiler. L'analisi dei dati del profilo è in genere un processo iterativo che si basa sulla tua conoscenza della progettazione dell'applicazione e del suo linguaggio di programmazione.

*Consulta quanto segue Profilazione a livello di Google: un'infrastruttura di profilazione continua per i data center e Profilazione continua: dove sono finiti tutti i cicli?.

Tipi di profilazione disponibili

La seguente tabella riassume i tipi di profili supportati:

Tipo di profilo Go Java Node.js Python
Tempo CPU YY Y
Heap YY Y
Heap allocato Y
Contesa Y
Thread Y
Tempo totale di esecuzione Y YY

Il resto di questa sezione fornisce ulteriori dettagli su ciascuno di questi tipi di profilo.

Misurazioni del tempo

  • Il tempo CPU è il tempo impiegato dalla CPU per l'esecuzione di un blocco di codice.

    Il tempo di CPU per una funzione indica per quanto tempo la CPU è rimasta impegnata nell'esecuzione delle istruzioni. Non include il tempo di attesa o di elaborazione delle istruzioni della CPU per qualcos'altro.

  • L'orario a muro (chiamato anche tempo di esecuzione) è il tempo necessario per eseguire un blocco di codice.

    Il tempo reale di una funzione misura il tempo trascorso tra l'entrata e l'uscita da una funzione. L'impostazione "tempo reale" include tutti i tempi di attesa, compresi quelli per i blocchi e la sincronizzazione dei thread. Il tempo totale di esecuzione per un blocco di codice non può mai essere inferiore al tempo di CPU.

Se il tempo reale è superiore a quello di CPU, significa che il codice trascorre tempo in attesa. Se la differenza è sostanziale, l'applicazione potrebbe avere un collo di bottiglia delle risorse.

Se il tempo di CPU è simile al tempo totale di esecuzione, significa che il codice richiede un uso intensivo della CPU: quasi tutto il tempo necessario per l'esecuzione è dedicato alla CPU. Blocchi di codice a lunga esecuzione che utilizzano la CPU potrebbero essere candidati per l'ottimizzazione.

Utilizzo heap (memoria)

  • L'utilizzo dell'heap (chiamato anche heap) è la quantità di memoria allocata nell'heap del programma nel momento in cui viene raccolto il profilo. A differenza degli altri tipi di profilo in cui i dati vengono raccolti in un intervallo, questo tipo di profilo raccoglie l'utilizzo dell'heap in un singolo momento.

  • L'allocazione dell'heap (detta anche heap allocato) è la quantità totale di memoria allocata nell'heap del programma durante l'intervallo in cui è stato raccolto il profilo. Questo valore include la memoria allocata, liberata e non più in uso. Considera ad esempio un job che ripete la seguente sequenza: alloca 1 MiB, attende 500 msec, libera 1 MiB e attende 500 msec. Nei 10 secondi in cui viene raccolto il profilo heap allocato, sono presenti 10 allocazioni e 10 gratuite. Questo profilo mostrerebbe l'heap allocato di 10 MiB, in quanto le risorse gratuite non vengono prese in considerazione. La frequenza media di allocazione è 10 MiB/10 secondi o 1 MiB al secondo.

La profilazione dell'utilizzo dell'heap ti consente di individuare potenziali inefficienze e perdite di memoria nei tuoi programmi. La profilazione delle allocazioni dell'heap consente di sapere quali allocazioni comportano il maggior lavoro del garbage collector.

Informazioni sui thread

Le applicazioni che creano thread possono presentare thread bloccati e fuga di thread:

  • I thread bloccati sono thread creati, ma in attesa di un blocco. Questi thread non sono attualmente in esecuzione e potrebbero non essere mai eseguiti. Tuttavia, alla fine potrebbe essere eseguito un thread bloccato.
  • Le fughe di thread si verificano quando il numero di thread creati continua ad aumentare.

I thread bloccati sono una delle cause della divulgazione di thread.

A livello di frame, il profilo Thread mostra il numero medio di thread che includono quel frame. Questo tipo di profilo raccoglie l'utilizzo dei thread in un singolo momento.

Contesa

In un programma multi-thread, il tempo di attesa per serializzare l'accesso a una risorsa condivisa può essere significativo. La comprensione del comportamento conflittuale può guidare la progettazione del codice e fornire informazioni per l'ottimizzazione delle prestazioni.

Raccolta profilo

Il ruolo dell'agente profiler è acquisire i dati del profilo dalla tua applicazione e trasmetterli al backend Profiler utilizzando l'API Profiler. Ogni profilo riguarda una singola istanza di un'applicazione e include quattro campi che identificano in modo univoco il suo deployment:

  • Progetto Google Cloud
  • Nome applicazione
  • Zona di applicazione
  • Versione applicazione

Quando un agente è pronto ad acquisire un profilo, invia un comando API Profiler al backend di Profiler. Il backend riceve questa richiesta e, nello scenario più semplice, risponde immediatamente all'agente. La risposta specifica il tipo di profilo da acquisire. In risposta, l'agente acquisisce il profilo e lo trasmette al backend. Infine, il backend di Profiler associa il profilo al tuo progetto Google Cloud. Puoi quindi visualizzarlo e analizzarlo utilizzando l'interfaccia di Profiler.

La sequenza effettiva di handshake è più complessa di quanto descritto nel paragrafo precedente. Ad esempio, quando il profiler riceve una richiesta da un agente, il backend controlla il database per determinare se ha ricevuto richieste precedenti dall'agente. In caso contrario, il backend aggiunge le informazioni sull'agente al proprio database. Viene creato un nuovo deployment se i campi di deployment dell'agente non corrispondono alle impostazioni di nessun altro agente registrato.

In media, ogni minuto e per ogni deployment e tipo di profilo, il backend seleziona un agente e gli indica di acquisire un profilo. Ad esempio, se gli agenti per un deployment supportano la profilazione heap e tempo totale di esecuzione, in media vengono acquisiti due profili al minuto:

  • Per tutti i tipi di profilo, ad eccezione dell'utilizzo dell'heap e dei thread, un profilo singolo rappresenta i dati raccolti per 10 secondi.

  • Utilizzo dell'heap e profili dei thread raccolti all'istante.

Dopo che l'agente avvisa il backend di Profiler che è pronto per acquisire i dati, l'agente rimane inattivo finché il backend non risponde con il tipo di profilo da acquisire. Se hai 10 istanze di un'applicazione in esecuzione nello stesso deployment, devi creare 10 agenti di profilazione. Tuttavia, la maggior parte delle volte questi agenti sono inattivi. Nell'arco di 10 minuti sono previsti 10 profili; ogni agente riceve in media una risposta per ogni tipo di profilo. Poiché è coinvolta una certa randomizzazione, il numero effettivo potrebbe variare.

Il backend di Profiler utilizza le quote dell'API Profiler e i campi di deployment del profilo per limitare i profili importati. Per informazioni sulla visualizzazione e sulla gestione delle quote di Profiler, consulta Quote e limiti.

Analisi dei dati

Dopo che Profiler ha raccolto i dati, puoi visualizzarli e analizzarli utilizzando l'interfaccia di Profiler.

Nella console Google Cloud, vai alla pagina Profiler:

Vai a Profiler

Puoi trovare questa pagina anche utilizzando la barra di ricerca.