Analizzare le prestazioni usando la profilatura della CPU nel profiler prestazioni (C#, Visual Basic, C++, F#)

Un buon modo per iniziare a analizzare i problemi di prestazioni nell'app consiste nel comprendere l'utilizzo della CPU usando un profiler cpu. Lo strumento prestazioni Utilizzo CPU mostra il tempo di CPU e la percentuale di esecuzione del codice in C++, C#/Visual Basic.

Lo strumento Utilizzo CPU consente di:

  • Diagnosticare un rallentamento o un blocco del processo nella codebase del team. Lo strumento consente di diagnosticare il problema con il codice di produzione del team. Lo strumento fornisce informazioni dettagliate automatiche e diverse visualizzazioni dei dati in modo da poter analizzare e diagnosticare i problemi di prestazioni.

  • Identificare i problemi di prestazioni negli scenari DevOps, ad esempio quando un cliente segnala che alcune richieste o ordini non passano al sito Web di vendita al dettaglio durante la stagione di punta. Spesso, i problemi si trovano nell'ambiente di produzione ed è difficile eseguire il debug in quel momento, ma questo strumento consente di acquisire informazioni e prove sufficienti del problema. Dopo aver raccolto un file di traccia, l'analisi può aiutare rapidamente a comprendere le possibili cause e fornire suggerimenti all'interno del contesto del codice in modo da poter eseguire i passaggi successivi per risolvere il problema.

  • Se il problema di latenza non si trova all'interno di una richiesta API, è possibile verificare l'utilizzo elevato della CPU e altri problemi correlati con lo strumento Utilizzo CPU. Lo strumento Utilizzo CPU consente di identificare i colli di bottiglia in modo da limitare la posizione in cui ottimizzare.

Lo strumento Utilizzo CPU è utile sia per le sessioni di traccia locali che per la produzione. Lo strumento Utilizzo CPU può essere avviato anche usando i tasti di scelta rapida ALT+F2 e quindi scegliendo Utilizzo CPU oppure aprendo una traccia già raccolta usando uno strumento come dotnet-trace o dotnet-monitor. Per il codice di produzione .NET, è molto probabile come raccogliere le tracce.

Lo strumento Utilizzo CPU può essere eseguito in un progetto di Visual Studio aperto, in un'app di Microsoft Store installata oppure può essere collegato a un'app o un processo in esecuzione. È possibile eseguire lo strumento Utilizzo CPU con o senza il debug. Per altre informazioni, vedere Eseguire gli strumenti di profilatura con o senza il debugger.

Le istruzioni seguenti illustrano come usare lo strumento Utilizzo CPU senza il debugger, con Profiler prestazioni di Visual Studio. L'esempio usa una build di rilascio in un computer locale. Le build di rilascio offrono la migliore visualizzazione delle prestazioni effettive dell'app. Per un'esercitazione che illustra come migliorare le prestazioni usando lo strumento Utilizzo CPU, vedere guida per principianti all'ottimizzazione del codice.

In genere il computer locale replica in modo ottimale l'esecuzione dell'app installata. Per raccogliere dati da un dispositivo remoto, eseguire l'app direttamente nel dispositivo e non tramite una connessione Desktop remoto.

Raccogliere i dati di utilizzo della CPU

  1. Nel progetto di Visual Studio impostare la configurazione della soluzione su Rilascio e selezionare Debugger Windows locale (o Computer locale) come destinazione di distribuzione.

    Screenshot che mostra Select Release (Seleziona versione) e Local Machine (Computer locale).

    Screenshot che mostra Select Release (Seleziona versione) e Local Machine (Computer locale).

  2. Selezionare Debug>Profiler prestazioni.

  3. In Strumenti disponibili selezionare Utilizzo CPU e quindi selezionare Avvia.

    Screenshot che mostra Select CPU Usage (Seleziona utilizzo CPU).

    Screenshot che mostra Select CPU Usage (Seleziona utilizzo CPU).

    Se si abilita l'opzione Avvia con raccolta sospesa prima di avviare il profiler, i dati non verranno raccolti finché non si seleziona il pulsante Registra nella visualizzazione sessione di diagnostica.

    Nota

    Per altre informazioni su come rendere lo strumento più efficiente, vedere Ottimizzazione delle impostazioni del profiler.

  4. Dopo l'avvio dell'app, la sessione di diagnostica inizia e visualizza i dati di utilizzo della CPU. Dopo aver completato la raccolta dei dati, selezionare Arresta raccolta.

    Screenshot che mostra stop CPU Usage data collection (Arresta raccolta dati utilizzo CPU).

    Screenshot che mostra stop CPU Usage data collection (Arresta raccolta dati utilizzo CPU).

    Lo strumento Utilizzo CPU analizza i dati e visualizza il report. In caso di problemi durante la raccolta o la visualizzazione dei dati, vedere Risolvere gli errori di profilatura e risolvere i problemi.

    Screenshot che mostra il report Utilizzo CPU.

    Screenshot che mostra il report Utilizzo CPU.

    Usare l'elenco a discesa Filtro per selezionare o deselezionare i thread da visualizzare e usare la casella Ricerca per cercare un thread o un nodo specifico.

Colonne di dati di utilizzo della CPU

Nome Descrizione
CPU totale [unità, %] Equazione % dati totali

Millisecondi e percentuale dell'attività della CPU usata dalle chiamate alla funzione e dalle funzioni chiamate dalla funzione nell'intervallo di tempo selezionato. Il valore è diverso da quello del grafico della sequenza temporale di Utilizzo CPU, che confronta l'attività CPU totale dell'app in un intervallo di tempo con la capacità CPU disponibile totale.
CPU auto [unità, %] Equazione % auto

Millisecondi e percentuale dell'attività della CPU usata dalle chiamate alla funzione nell'intervallo di tempo selezionato, escluse le funzioni chiamate dalla funzione.
Modulo In alcune visualizzazioni viene visualizzata la colonna Module, che mostra il nome del modulo contenente la funzione.

Analizzare le informazioni dettagliate sulla CPU

Per analizzare le informazioni dettagliate principali, le funzioni principali e il percorso critico, vedere Informazioni dettagliate sulla CPU.

Analizzare l'utilizzo della CPU

Per analizzare il report Utilizzo CPU, fare clic su Apri dettagli oppure fare clic su una delle funzioni principali per aprire la visualizzazione Funzioni .

Il report fornisce visualizzazioni diverse dei dati di diagnostica:

  • Chiamante/chiamato
  • Albero delle chiamate
  • Moduli
  • Funzioni
  • Grafico di fiamma

Per analizzare il report, fare clic su Crea report dettagliato.

Il report fornisce visualizzazioni diverse dei dati di diagnostica:

  • Chiamante/chiamato
  • Albero delle chiamate

In tutte le visualizzazioni, ad eccezione del chiamante/chiamato, il report di diagnostica viene ordinato in base alla CPU totale, dal più alto al più basso. Per modificare l'ordinamento o la colonna di ordinamento, selezionare le intestazioni di colonna. È possibile fare doppio clic su una funzione a cui si è interessati e verrà visualizzata l'origine per la funzione, nonché l'evidenziazione che mostra dove viene impiegato il tempo in tale funzione. La tabella mostra le colonne con dati, ad esempio il tempo impiegato nella funzione, incluse le funzioni chiamate (CPU totale) e una seconda colonna che mostra il tempo impiegato in una funzione, escludendo le funzioni chiamate (CPU self).

Questi dati consentono di valutare se la funzione stessa è un collo di bottiglia delle prestazioni. Determinare la quantità di dati visualizzati dal metodo per verificare se il codice o le librerie di runtime di terze parti sono il motivo per cui gli endpoint sono lenti o a consumo elevato delle risorse.

Per altre informazioni sull'uso del grafico Flame, vedere Identificare i percorsi caldi con Flame Graph.

Albero delle chiamate di Utilizzo CPU

Per visualizzare l'albero delle chiamate, selezionare il nodo padre nel report. Per impostazione predefinita, la pagina Utilizzo CPU viene visualizzata nella visualizzazione Chiamante/chiamato . Nell'elenco a discesa Visualizzazione corrente selezionare Albero delle chiamate.

È possibile fare clic sui pulsanti Espandi percorso critico e Mostra percorso critico per visualizzare le chiamate di funzione che usano la percentuale più alta della CPU nella visualizzazione albero delle chiamate.

Struttura dell'albero delle chiamate

Screenshot che mostra la struttura dell'albero delle chiamate.

Screenshot che mostra la struttura dell'albero delle chiamate.

Immagine Descrizione
Passaggio 1 Il nodo di livello principale nell'albero delle chiamate di Utilizzo CPU è uno pseudo-nodo.
Passaggio 2 Nella maggior parte delle app, quando l'opzione Mostra codice esterno opzione è disabilitata il nodo di secondo livello è un nodo [Codice esterno]. Il nodo contiene il codice di sistema e di framework che avvia e arresta l'app, disegna l'interfaccia utente, controlla la pianificazione dei thread e offre altri servizi di basso livello all'app.
Passaggio 3 Gli elementi figlio del nodo di secondo livello sono i metodi del codice utente e le routine asincrone che vengono chiamati o creati dal codice di sistema o di framework di secondo livello.
Passaggio 4 I nodi figlio di un metodo contengono dati solo per le chiamate del metodo padre. Quando l'opzione Mostra codice esterno è disabilitata, i metodi dell'app possono contenere anche un nodo [Codice esterno] .

Codice esterno

Le funzioni di sistema e framework eseguite dal codice sono dette codice esterno. Le funzioni codice esterno avviano e arrestano l'app, disegnano l'interfaccia utente, controllano il threading e offre altri servizi di basso livello all'app. Nella maggior parte dei casi il codice esterno non risulta interessante, pertanto l'albero delle chiamate di Utilizzo CPU raccoglie le funzioni esterne di un metodo utente in un unico nodo [Codice esterno].

Per visualizzare i percorsi delle chiamate del codice esterno, passare alla visualizzazione Struttura ad albero delle chiamate oppure fare clic con il pulsante destro del mouse e selezionare Visualizza in Albero delle chiamate.

Screenshot che mostra Mostra nell'albero delle chiamate.

Per visualizzare i percorsi delle chiamate di codice esterno, nella pagina del report di diagnostica principale (riquadro destro) selezionare Mostra codice esterno nell'elenco a discesa Filtro e quindi selezionare Applica. La visualizzazione Albero delle chiamate della pagina Utilizzo CPU espande le chiamate al codice esterno. L'elenco a discesa Filtro è disponibile nella pagina di diagnostica principale, non nelle visualizzazioni dettagliate.

Screenshot che mostra Mostra codice esterno.

Numerose catene di chiamate del codice esterno sono annidate in profondità, pertanto la larghezza della catena può superare la larghezza di visualizzazione della colonna Nome funzione. I nomi delle funzioni vengono quindi visualizzati come illustrato nell'immagine seguente.

Screenshot che mostra il codice esterno annidato nell'albero delle chiamate.

Numerose catene di chiamate del codice esterno sono annidate in profondità, pertanto la larghezza della catena può superare la larghezza di visualizzazione della colonna Nome funzione. In questo caso i nomi delle funzioni vengono visualizzati come ....

Screenshot che mostra il codice esterno annidato nell'albero delle chiamate.

Per trovare il nome di una funzione, usare la casella di ricerca. Passare il mouse sopra la riga selezionata oppure usare la barra di scorrimento orizzontale per visualizzare i dati.

Screenshot che mostra La ricerca di codice esterno annidato.

Screenshot che mostra La ricerca di codice esterno annidato.

Funzioni asincrone nell'albero delle chiamate di utilizzo della CPU

Quando il compilatore rileva un metodo asincrono, crea una classe nascosta per controllare l'esecuzione del metodo. A livello concettuale la classe è una macchina a stati. La classe dispone di funzioni generate dal compilatore che chiamano in modo asincrono i metodi originali e i callback, l'utilità di pianificazione e gli iteratori necessari per la loro esecuzione. Quando un metodo padre chiama il metodo originale, il compilatore rimuove il metodo dal contesto di esecuzione del metodo padre ed esegue i metodi della classe nascosta nel contesto del codice di sistema e di framework che controlla l'esecuzione dell'app. Spesso, ma non sempre, i metodi asincroni vengono eseguiti in uno o più thread diversi. Il codice è visualizzato nell'albero delle chiamate Utilizzo CPU come figlio del nodo [Codice esterno] immediatamente sotto il nodo principale dell'albero.

Nell'esempio seguente i primi due nodi sotto [Codice esterno] sono i metodi generati dal compilatore della classe macchina a stati. Il terzo nodo è la chiamata al metodo originale.

Screenshot che mostra il nodo asincrono.

Espandere i metodi generati per vedere che cosa accade:

Screenshot che mostra il nodo asincrono espanso.

Screenshot che mostra il nodo asincrono espanso.

  • MainPage::GetMaxNumberAsyncButton_Click si limita a gestire un elenco dei valori delle attività, a calcolare il massimo dei risultati e a visualizzare l'output.

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext mostra l'attività necessaria per pianificare e avviare le 48 attività che eseguono il wrapping della chiamata a GetNumberAsync.

  • MainPage::<GetNumberAsync>b__b visualizza le operazioni eseguite dalle attività che chiamano GetNumber.

Raccogliere i conteggi delle chiamate (.NET)

Se si desidera visualizzare i conteggi delle chiamate nella visualizzazione Funzioni, è possibile abilitare l'impostazione prima di avviare il profiler. Questa impostazione è supportata per i tipi di progetto .NET e richiede l'avvio del processo nel profiler. Lo scenario di collegamento non è supportato.

  1. Selezionare l'icona Impostazioni per Utilizzo CPU nel Profiler prestazioni.

    Screenshot che mostra l'icona delle impostazioni per Utilizzo CPU.

  2. Abilitare l'opzione Raccogli conteggi chiamate (solo.NET).

    Screenshot che mostra le impostazioni per Utilizzo CPU.

  3. Raccogliere i dati di utilizzo della CPU.

  4. Aprire la visualizzazione Funzioni e quindi assicurarsi che la colonna Conteggio chiamate sia impostata su visibile.

    Se la colonna non viene visualizzata, fare clic con il pulsante destro del mouse su un'intestazione di colonna per scegliere le colonne visibili.

    Screenshot che mostra i dati relativi al numero di chiamate.