Condividi tramite


Visualizzare i dati del profiler di Application Insights

Si supponga di eseguire un test delle prestazioni Web. Sono necessarie tracce per comprendere in che modo l'app Web è in esecuzione in fase di caricamento. Contenuto dell'articolo:

  • Generare traffico all'app Web avviando un test delle prestazioni Web o avviando una sessione on demand di Profiler.
  • Visualizzare le tracce del Profiler dopo il test di carico o la sessione di Profiler.
  • Informazioni su come leggere i dati sulle prestazioni del profiler e lo stack di chiamate.

Generare traffico al servizio di Azure

Affinché Profiler carichi tracce, il servizio deve gestire attivamente le richieste.

Se profiler è stato appena abilitato, eseguire un breve test di carico con Test di carico di Azure.

Se il servizio di Azure ha già traffico in ingresso o se si vuole solo generare manualmente il traffico, ignorare il test di carico e avviare una sessione on demand di Profiler:

  1. Nella pagina di panoramica di Application Insights per il servizio di Azure selezionare Prestazioni dal menu a sinistra.

  2. Nel riquadro Prestazioni selezionare Profiler dal menu in alto per le impostazioni del profiler.

    Screenshot of the Profiler button from the Performance pane.

  3. Dopo aver caricato la pagina delle impostazioni del profiler, selezionare Profilo ora.

    Screenshot of Profiler page features and settings.

Visualizzare le tracce

  1. Al termine dell'esecuzione delle sessioni del profiler, tornare al riquadro Prestazioni .

  2. In Drill-into...selezionare Tracce profiler per visualizzare le tracce.

    Screenshot of trace explorer page.

La finestra di esplorazione delle analisi visualizza le informazioni seguenti:

Filtro Descrizione
Albero dei profili v. Grafico di fiamma Visualizzare le tracce come albero o in forma di grafo.
Percorso critico Selezionare questa opzione per aprire il nodo foglia più grande. Nella maggior parte dei casi questo nodo è vicino a un collo di bottiglia delle prestazioni.
Dipendenze del framework Selezionare questa opzione per visualizzare ognuna delle dipendenze del framework tracciate associate alle tracce.
Nascondi eventi Digitare stringhe da nascondere dalla visualizzazione di traccia. Selezionare Eventi suggeriti per i suggerimenti.
Event Nome evento o funzione. L'albero visualizza una combinazione di codice e di eventi che si sono verificati, ad esempio eventi SQL e HTTP. L'evento principale rappresenta la durata complessiva della richiesta.
Modulo Modulo in cui si è verificato l'evento o la funzione tracciata.
Tempo thread l'intervallo di tempo tra l'inizio e la fine dell'operazione.
Sequenza temporale tempo in cui la funzione o l'evento è stato eseguito in relazione ad altre funzioni.

Procedura: leggere i dati sulle prestazioni

Profiler usa una combinazione di metodi di campionamento e strumentazione per analizzare le prestazioni dell'applicazione. Durante l'esecuzione di una raccolta dettagliata, profiler:

  • Campiona il puntatore all'istruzione di ogni CPU del computer ogni millisecondo.
    • Ogni esempio acquisisce lo stack di chiamate completo del thread, fornendo informazioni dettagliate a livelli elevati e bassi di astrazione.
  • Raccoglie gli eventi per tenere traccia della correlazione delle attività e della causalità, tra cui:
    • Eventi di cambio di contesto
    • Eventi TPL (Task Parallel Library)
    • Eventi del pool di thread

Lo stack di chiamate visualizzato nella visualizzazione sequenza temporale è il risultato del campionamento e della strumentazione. Poiché ogni esempio acquisisce lo stack di chiamate completo del thread, include il codice di Microsoft .NET Framework e qualsiasi altro framework a cui si fa riferimento.

Allocazione di oggetti (clr! JIT_New o clr! JIT_Newarr1)

Clr! JIT_New e clr! JIT_Newarr1 sono funzioni helper in .NET Framework che allocano memoria da un heap gestito.

  • Clr! JIT_New viene richiamato quando viene allocato un oggetto.
  • Clr! JIT_Newarr1 viene richiamato quando viene allocata una matrice di oggetti.

Queste due funzioni funzionano in genere rapidamente. Se clr! JIT_New o clr! JIT_Newarr1 richiedere tempo nella sequenza temporale, il codice potrebbe allocare molti oggetti e consumare quantità significative di memoria.

Caricamento di codice (clr!ThePreStub)

Clr! ThePreStub è una funzione helper in .NET Framework che prepara il codice per l'esecuzione iniziale, che in genere include la compilazione JIT (Just-In-Time). Per ogni metodo C#, clr! Il metodoPreStub deve essere richiamato al massimo una volta durante un processo.

Se clr! ThePreStub richiede tempo aggiuntivo per una richiesta, è la prima richiesta per eseguire tale metodo. Il runtime di .NET Framework richiede molto tempo per caricare il primo metodo. Tenere in considerazione:

  • Uso di un processo di riscaldamento che esegue tale parte del codice prima che gli utenti accervino.
  • Esecuzione del generatore di immagini native (ngen.exe) sugli assembly.

Contesa di blocco (clr! JITutil_MonContention o clr! JITutil_MonEnterWorker)

Clr! JITutil_MonContention o clr! JITutil_MonEnterWorker indicano che il thread corrente è in attesa del rilascio di un blocco. Questo testo viene spesso visualizzato quando:

  • Eseguire un'istruzione C# LOCK ,
  • Richiamare il metodo Monitor.Enter oppure
  • Richiamare un metodo con l'attributo MethodImplOptions.Synchronized .

La contesa di blocchi si verifica in genere quando il thread A acquisisce un blocco e il thread B prova ad acquisire lo stesso blocco prima che il thread A lo rilasci.

Caricamento di codice ([COLD])

Se il runtime di .NET Framework esegue il codice non ottimizzato per la prima volta, il nome del metodo conterrà [COLD]:

mscorlib.ni![COLD]System.Reflection.CustomAttribute.IsDefined

Per ogni metodo, deve essere visualizzato una sola volta durante il processo, al massimo.

Se il caricamento del codice richiede una notevole quantità di tempo per una richiesta, si tratta dell'avvio dell'esecuzione della parte non ottimizzata del metodo. Considerare un processo di riscaldamento che esegua tale parte del codice prima che gli utenti accedano a esso.

Inviare una richiesta HTTP

Metodi come HttpClient.Send indicano che il codice è in attesa del completamento di una richiesta HTTP.

Operazione di database

Metodi come SqlCommand.Execute indicano che il codice è in attesa del completamento di un'operazione di database.

In attesa (AWAIT_TIME)

AWAIT_TIME indica che il codice è in attesa del completamento di un'altra attività. Questo ritardo si verifica con l'istruzione C# AWAIT . Quando il codice esegue un'operazione C# AWAIT:

  • Il thread si rimuove e restituisce il controllo al pool di thread.
  • Non è previsto alcun thread bloccato in attesa del completamento di AWAIT .

Tuttavia, logicamente, il thread che ha eseguito await è "bloccato", in attesa del completamento dell'operazione. L'istruzione AWAIT_TIME indica il tempo bloccato, in attesa del completamento dell'attività.

Se il AWAIT_TIME sembra essere nel codice del framework anziché nel codice, il profiler potrebbe visualizzare:

  • Codice del framework usato per eseguire AWAIT
  • Codice usato per registrare i dati di telemetria relativi a AWAIT

È possibile deselezionare la casella di controllo Dipendenze framework nella parte superiore della pagina per visualizzare solo il codice e semplificare la visualizzazione della provenienza di AWAIT .

Tempo di blocco

BLOCKED_TIME indica che il codice è in attesa di un'altra risorsa disponibile. Ad esempio, potrebbe essere in attesa di:

  • Oggetto di sincronizzazione
  • Thread da rendere disponibile
  • Richiesta di completamento

Asincrona non gestita

Per tenere traccia delle chiamate asincrone tra thread, .NET Framework genera eventi ETW e passa gli ID attività tra thread. Poiché il codice non gestito (nativo) e alcuni stili meno recenti del codice asincrono non dispongono di questi eventi e ID attività, il Profiler non può tenere traccia del thread e delle funzioni in esecuzione nel thread. Questo elemento è etichettato Asincrona non gestita nello stack di chiamate. Scaricare il file ETW per usare PerfView per altre informazioni dettagliate.

Tempo CPU

La CPU è occupata nell'esecuzione di istruzioni.

Tempo del disco

L'applicazione sta eseguendo operazioni su disco.

Tempo di rete

L'applicazione sta eseguendo operazioni sulla rete.

Colonna Quando

La colonna When è una visualizzazione della varietà di esempi inclusivi raccolti per un nodo nel tempo. L'intervallo totale della richiesta è suddiviso in 32 bucket di tempo, in cui si accumulano campioni inclusivi del nodo. Ogni intervallo è rappresentato come una barra. L'altezza della barra rappresenta un valore ridimensionato. Per i nodi seguenti, la barra rappresenta il consumo di una delle risorse durante il bucket:

  • Nodi contrassegnati CPU_TIME o BLOCKED_TIME.
  • Nodi con una relazione ovvia con l'utilizzo di una risorsa, ad esempio una CPU, un disco o un thread.

Per queste metriche, è possibile ottenere un valore maggiore del 100% usando più risorse. Ad esempio, se si usano due CPU durante un intervallo in media, si ottiene il 200%.

Passaggi successivi

Scopri come...