Visualizzare Application Insights Profiler per i dati .NET
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
Per consentire a .NET Profiler di caricare tracce, il servizio deve gestire attivamente le richieste.
Se il profiler per .NET è 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:
Nella pagina di panoramica di Application Insights per il servizio di Azure selezionare Prestazioni nel menu a sinistra.
Nel riquadro Prestazioni selezionare Profiler nel menu in alto per le impostazioni del Profiler.
Dopo aver caricato la pagina delle impostazioni del Profiler, selezionare Profila ora.
Visualizzare le tracce
Al termine dell'esecuzione delle sessioni del Profiler, tornare al riquadro Prestazioni.
In Esegui drill in... selezionare Tracce Profiler per visualizzare le tracce.
La finestra di esplorazione delle analisi visualizza le informazioni seguenti:
Filtro | Descrizione |
---|---|
Albero dei profili v. Grafico a 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 dal 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. |
Ora 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
.NET Profiler usa una combinazione di metodi di campionamento e strumentazione per analizzare le prestazioni dell'applicazione. Durante l'esecuzione di una raccolta dettagliata, .NET 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 riportato nella visualizzazione della sequenza temporale è il risultato del campionamento e della strumentazione. Poiché ogni esempio acquisisce lo stack di chiamate completo del thread, include codice di Microsoft .NET Framework e di eventuali altri 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 si alloca un oggetto.
- clr!JIT_Newarr1 viene richiamato quando si alloca una matrice di oggetti.
Queste due funzioni funzionano in genere rapidamente. Se clr!JIT_New o clr!JIT_Newarr1 impiega molto tempo nella sequenza temporale, è possibile che il codice stia allocando numerosi oggetti e stia utilizzando una notevole quantità 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 Just-In-Time (JIT). Per ogni metodo C#, la funzione clr!ThePreStub deve essere chiamata al massimo una volta nel corso di un processo.
Se clr! ThePreStubchiede 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:
- Eseguire un processo di riscaldamento che esegua tale parte del codice prima che gli utenti accedano a esso.
- Esecuzione del generatore di immagini native (ngen.exe) sugli assembly.
Blocca conflitto (clr!JITutil_MonContention o clr!JITutil_MonEnterWorker)
clr!JITutil_MonContention o clr!JITutil_MonEnterWorker indica che il thread corrente è in attesa di un blocco da rilasciare. 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 al massimo una volta nel corso del processo.
Se il caricamento del codice per una richiesta richiede una quantità di tempo sostanziale, si tratta della richiesta che avvia l'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, in modo logico il thread che ha eseguito AWAIT viene "bloccato" in attesa che venga completata l'operazione. L'istruzione AWAIT_TIME indica il tempo di blocco in attesa del completamento dell'attività.
Se il AWAIT_TIME sembra essere nel codice del framework anziché nel codice, il profiler .NET potrebbe mostrare:
- 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
Asincrono non gestito
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 .NET non è in grado di 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 Quando è una visualizzazione della variazione nel tempo degli 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 di più del 100% utilizzando più risorse. Ad esempio, se in media si usano due CPU in un intervallo si ottiene il 200%.
Passaggi successivi
Informazioni su...