Risolvere i problemi
Questa pagina mostra come risolvere i problemi relativi a Cloud Profiler.
Errori relativi alla configurazione del tuo progetto Google Cloud
Questa sezione elenca i problemi di configurazione che potresti riscontrare e fornisce suggerimenti per risolverli.
L'API Cloud Profiler è disabilitata
Il seguente errore si verifica quando l'API Profiler non è abilitata per il tuo progetto Google Cloud:
failed to create a profile, will retry: rpc error: code = PermissionDenied desc = Cloud Profiler API has not been used in project 012345 before or it is disabled.
Per risolvere questo problema, nel progetto Google Cloud deve essere abilitata l'API Profiler:
-
Attiva l'API richiesta.
Se viene visualizzato API abilitata, l'API è già abilitata. In caso contrario, fai clic sul pulsante Attiva.
Il chiamante non dispone dell'autorizzazione
Il seguente errore si verifica quando non hai l'autorizzazione per scrivere dati di profilazione in un progetto Google Cloud:
failed to create a profile, will retry: rpc error: code = PermissionDenied desc = The caller does not have permission.
Per risolvere il problema, chiedi all'amministratore di concederti autorizzazioni aggiuntive per il progetto. Per un elenco dettagliato delle autorizzazioni e dei ruoli richiesti, vedi Controllo dell'accesso.
Errori con Node.js
Questa sezione elenca i problemi che potresti riscontrare quando utilizzi l'agente di profilazione Node.js e fornisce suggerimenti su come risolverli.
L'applicazione non si chiude normalmente con Node.js
L'agente di profilazione per Node.js interferisce con la normale uscita dal programma; la chiusura del programma può richiedere fino a un'ora dopo il completamento di tutte le attività del programma.
Per risolvere il problema,
emetti un indicatore SIGINT
, ad esempio utilizzando Ctrl-C
. Quando emetti un
indicatore SIGINT
, il processo si interrompe normalmente.
Errori con Python
Questa sezione elenca i problemi che potresti riscontrare quando utilizzi l'agente di profilazione Python e fornisce suggerimenti su come risolverli.
Eccezione NotImplementedError
con Python
Viene generata la seguente eccezione durante l'esecuzione della funzione start
quando l'applicazione viene eseguita in un ambiente non Linux:
NotImplementedError
Per risolvere il problema, esegui l'applicazione in un ambiente Linux.
Eccezione ValueError
con Python
La seguente eccezione viene generata durante start
se gli argomenti della funzione non sono validi, quando non è possibile determinare le informazioni necessarie dalle variabili e dagli argomenti di ambiente o quando sono disabilitati il tempo di CPU e la profilazione del tempo di esecuzione:
ValueError
Per risolvere il problema, verifica quanto segue:
- Assicurati che il nome e la versione del servizio soddisfino i requisiti definiti in Argomenti Nome e versione del servizio.
- Se la profilazione del muro è abilitata, assicurati che
start
venga chiamato dal thread principale. - Assicurati di utilizzare una versione supportata di Python e che la profilazione del tempo di CPU o del tempo di esecuzione sia abilitata. Per maggiori
informazioni, vedi Funzione
start
. - Verifica di aver specificato il parametro
project_id
sustart
se stai eseguendo l'esecuzione al di fuori di Google Cloud. Per maggiori informazioni, vedi Funzionestart
.
Errori di risorsa temporaneamente non disponibili con Python
Dopo l'abilitazione di Profiler, il log degli errori contiene le seguenti voci:
BlockingIOError: [Errno 11] Resource temporarily unavailable Exception ignored when trying to write to the signal wakeup fd
Questi messaggi vengono visualizzati quando un'applicazione si registra con il descrittore del file di wakeup dei segnali, signal.set_wakeup_fd
.
Per impostazione predefinita, se il buffer del descrittore del file si riempie, viene registrato un avviso in stderr.
Quando Cloud Profiler raccoglie i profili, attiva gli indicatori con alta frequenza e può causare il riempimento del descrittore del file dei segnali. Per il problema relativo a GitHub, vedi BlockIOError on App Engine.
Per risolvere il problema, procedi in uno dei seguenti modi:
Se la tua applicazione può essere eseguita in modo sicuro quando vengono persi indicatori, puoi usare Cloud Profiler. Se utilizzi Python 3.7 o versioni successive e vuoi disabilitare i messaggi di avviso, passa
warn_on_full_buffer=False
come parametro asignal.set_wakeup_fd
.Se l'applicazione non può essere eseguita in modo sicuro quando vengono persi indicatori, ti consigliamo di interrompere l'utilizzo di Cloud Profiler. L'uso continuato potrebbe causare la perdita dei numeri di indicatori e un numero eccessivo di voci nel log degli errori.
Tutti i profili mancanti
Esistono due motivi comuni per cui potresti non vedere nessun profilo:
- L'esecuzione del servizio non è sufficiente per consentire la raccolta dei profili.
- Il servizio non è configurato per l'autenticazione.
Per risolvere i problemi relativi a un breve tempo di esecuzione, assicurati che il servizio venga eseguito continuamente per almeno 3 minuti.
Per risolvere i problemi relativi all'autenticazione, assicurati che l'agente di profilazione possa scrivere dati nel progetto Google Cloud:
Se il servizio è in esecuzione su Google Cloud, l'autenticazione è automatica, tranne quando esegui il deployment di un container su Compute Engine. Quando esegui il deployment di un container su Compute Engine, devi specificare il tuo ID progetto Google Cloud nel comando
start
dell'agente Profiler. Per le istruzioni, consulta Collegamento dell'agente a un progetto Google Cloud.Se il tuo servizio è in esecuzione al di fuori di Google Cloud, devi creare un account di servizio e collegare l'agente Profiler al tuo progetto Google Cloud. Per maggiori informazioni, consulta Profilazione all'esterno di Google Cloud.
Mancano profili di un tipo specifico
In questa sezione sono elencate le configurazioni specifiche in cui non vengono raccolti i profili di uno o più tipi di profilo. La prima sezione include contenuti generali, mentre le restanti sezioni elencano problemi per lingue specifiche.
Informazioni generali
Se vuoi visualizzare un tipo di profilo specifico, ma non sono disponibili profili di quel tipo, verifica quanto segue:
Assicurati che il tipo di profilo sia supportato per la lingua dell'applicazione. Per saperne di più, consulta l'articolo Tipi di profilazione disponibili.
Assicurati di aver utilizzato una nuova versione del servizio dopo aver modificato i tipi di profili raccolti. Se non specifichi una nuova versione del servizio, viene utilizzato un deployment esistente e l'agente di profilazione non può trasferire i dati per il tipo di profilo appena abilitato. Per maggiori informazioni sui deployment, vedi Raccolta profili.
Assicurati che il tipo di profilo sia abilitato. Alcuni tipi di profilo sono disattivati per impostazione predefinita. Per ulteriori informazioni, vedi le pagine dedicate alle singole lingue:
Le restanti sezioni di questa pagina descrivono le configurazioni specifiche per lingua in cui non vengono raccolti i dati per un tipo di profilo.
Go: i profili di tempo di CPU non vengono raccolti per c-archives
Quando viene creata un'applicazione Go con il flag -buildmode
impostato
su c-archive
o c-shared
, la profilazione del tempo di CPU è
disabilitata per impostazione predefinita. Vengono raccolti profili di heap, contese e thread.
Per ulteriori informazioni, consulta
GitHub problema n. 993: il profiler non raccoglie i dati della CPU per il codice Go in un c-archivio.
Per risolvere il problema, abilita la raccolta dei profili di tempo della CPU prima delle chiamate di servizio profiler.Start
e aggiungi una chiamata a signal.Notify(make(chan os.Signal), syscall.SIGPROF)
.
Per ulteriori informazioni su signal.Notify
, consulta
func Notify
.
Java: i profili heap non vengono raccolti se sono abilitati più profiler
Hai abilitato più profiler heap per un'applicazione Java e non hai profili.
Il campionatore heap Java è abilitato come funzionalità di agente singolo. Il risultato è che può essere in uso un solo profiler alla volta. È stato aperto un bug per estendere Java al supporto di più profiler Heap. Per informazioni sul bug, consulta Aggiungere il supporto multi-agente per il meccanismo di campionamento dell'heap.
Per risolvere il problema, abilita un profiler.
Python: nessun tempo di CPU e nessun profilo Wall quando si utilizza uWSGI
Quando uWSGI utilizza più worker per gestire le richieste, il comportamento predefinito prevede l'esecuzione dell'inizializzazione dell'applicazione solo nel processo principale (master
). I processi creati con fork non eseguono
la sequenza di inizializzazione.
Se configuri l'agente di profilazione nella sequenza di inizializzazione dell'applicazione (ad esempio, configuri l'agente di profilazione nel metodo AppConfig.ready()
di un'applicazione Django), l'agente di profilazione non è configurato per i processi creati con fork.
Per risolvere il problema, esegui l'inizializzazione dell'applicazione in tutti i processi worker impostando il flag lazy-apps su true
.
Python: avere profili di tempo della CPU, ma nessun profilo Wall quando si utilizza uWSGI
Il profiler a parete dipende dal modulo del segnale Python. Quando l'interprete Python viene compilato con il supporto dei thread, la configurazione predefinita disabilita la gestione personalizzata dei segnali per i processi creati con fork.
Per risolvere il problema,
per le applicazioni uWSGI, abilita la gestione personalizzata dei segnali impostando il flag
py-call-osafterfork
su true
.
Python: nessun profilo per i processi creati con fork
Gli agenti di profilazione possono profilare solo il processo che ha avviato l'agente.
Per risolvere il problema, se la tua applicazione crea un fork e vuoi raccogliere profili dai processi creati con fork, inizializza l'agente dopo il fork.