Visualizzazione Thread nel visualizzatore di concorrenzaThreads view in the Concurrency Visualizer

La visualizzazione Thread è la visualizzazione più dettagliata e ricca di funzionalità disponibile nel visualizzatore di concorrenza.Threads view is the most detailed and feature-rich view in the Concurrency Visualizer. Nella visualizzazione Thread è possibile identificare i thread che eseguono codice durante un segmento di esecuzione e verificare se i thread stanno eseguendo o bloccando il codice per motivi di sincronizzazione, I/O o di altro tipo.In the Threads view, you can identify which threads are executing code during an execution segment, and analyze whether threads are executing or blocking because of synchronization, I/O, or other reasons. I report della visualizzazione Thread inoltre profilano l'esecuzione dell'albero dello stack di chiamate e i thread di sblocco.Threads view reports also profile call-stack tree execution and unblocking threads.

Quando i thread sono in esecuzione, il visualizzatore di concorrenza raccoglie campioni.While threads are executing, the Concurrency Visualizer collects samples. Al termine dell'esecuzione di un thread, il visualizzatore esamina tutti gli eventi di cambio di contesto del sistema operativo per il thread.When a thread has stopped executing, the visualizer examines all operating system context-switch events for the thread. I cambi di contesto possono verificarsi perché:Context switches can occur because:

  • Un thread è bloccato su una primitiva di sincronizzazione.A thread is blocked on a synchronization primitive.
  • Il quantum di un thread scade.The quantum of a thread expires.
  • Un thread esegue una richiesta di I/O di blocco.A thread makes a blocking I/O request.

Il visualizzatore di concorrenza classifica il thread e gli eventi di cambio di contesto e cerca nello stack di chiamate del thread le API di blocco conosciute.Concurrency Visualizer categorizes thread and context-switch events, and searches the call stacks of threads for well-known blocking APIs. Visualizza le categorie di thread nella legenda attiva in basso a sinistra nella visualizzazione Thread.It displays the thread categories in the active legend at lower-left in the Threads view. Nella maggior parte dei casi è possibile identificare la causa principale di un evento di blocco esaminando gli stack di chiamate che corrispondono agli eventi di cambio di contesto.In most cases, you can identify the root cause of a blocking event by examining the call stacks that correspond to context-switch events.

Se non vi è alcuna corrispondenza di stack di chiamate, il visualizzatore di concorrenza usa il motivo dell'attesa indicato da WINDOWSWindows.If there's no call stack match, Concurrency Visualizer uses the wait reason provided by WINDOWSWindows. Tuttavia, la categoria WINDOWSWindows può essere basata su un dettaglio di implementazione e non riflettere la finalità dell'utente.However, the WINDOWSWindows category may be based on an implementation detail, and may not reflect user intent. Ad esempio, WINDOWSWindows segnala il motivo dell'attesa per il blocco in lettura-scrittura nativo come I/O anziché come sincronizzazione.For example, WINDOWSWindows reports the wait reason for blocking on a native slim reader-writer lock as I/O instead of Synchronization.

La visualizzazione Thread illustra anche le dipendenze tra thread.Threads view also shows dependencies between threads. Ad esempio, se si individua un thread bloccato su un oggetto di sincronizzazione, è possibile trovare il thread che lo ha sbloccato.For example, if you identify a thread that's blocked on a synchronization object, you can find the thread that unblocked it. È possibile esaminare lo stack di chiamate per il thread di sblocco nel punto di cui ha sbloccato l'altro.You can examine the call stack for the unblocking thread at the point when it unblocked the other one.

È possibile usare la visualizzazione Thread per:You can use Threads view to:

  • Identificare i motivi per cui l'interfaccia utente di un'app non risponde durante alcune fasi di esecuzione.Identify reasons the user interface (UI) of an app is unresponsive during certain execution phases.
  • Determinare la quantità di tempo trascorso in un blocco dovuto a sincronizzazione, I/O, errori di pagina e altri eventi.Determine the amount of time that's spent blocking on synchronization, I/O, page faults, and other events.
  • Individuare il grado di interferenza da altri processi in esecuzione nel sistema.Discover the degree of interference from other processes that are executing on the system.
  • Identificazione dei problemi di bilanciamento del carico per l'esecuzione parallela.Identify load-balancing issues for parallel execution.
  • Trovare i motivi per la scalabilità non ottimale o non esistente.Find the reasons for suboptimal or nonexistent scalability. Ad esempio, il motivo per cui le prestazioni di un'app parallela non migliorano quando sono disponibili più core logici.For example, why does the performance of a parallel app not improve when more logical cores are available.
  • Individuazione del livello di concorrenza nell'app, per agevolare la parallelizzazione.Understand the degree of concurrency in the app, to help in parallelization.
  • Identificare le dipendenze tra thread di lavoro e percorsi critici di esecuzione.Identify dependencies among worker threads and critical paths of execution.

Usare la visualizzazione ThreadUse Threads view

Per avviare il visualizzatore di concorrenza, selezionare Analizza > Visualizzatore di concorrenza e quindi selezionare un'opzione, ad esempio Avvia nuovo processo.To start Concurrency Visualizer, select Analyze > Concurrency Visualizer, and then select an option, such as Launch New Process.

Il visualizzatore di concorrenza avvia l'app e raccoglie una traccia finché non si seleziona Arresta raccolta.Concurrency Visualizer starts the app and collects a trace until you select Stop Collection. Il visualizzatore quindi analizza la traccia e visualizza i risultati nella pagina del report di traccia.The visualizer then analyzes the trace and displays the results on the trace report page.

Selezionare la scheda Thread in alto a sinistra nel report per aprire la visualizzazione Thread.Select the Threads tab at upper-left in the report to open the Threads view.

Visualizzazione threadThreads view

Selezionare gli intervalli di tempo e i thread per avviare un'analisi delle prestazioni.Select time intervals and threads to start a performance analysis.

Analisi della sequenza temporaleTimeline analysis

La parte superiore della visualizzazione Thread è una sequenza temporale.The upper part of the Threads view is a timeline. La sequenza temporale indica l'attività di tutti i thread nel processo e di tutti i dispositivi disco fisici nel computer host.The timeline shows the activity of all threads in the process, and all physical disk devices on the host computer. Vengono inoltre visualizzati l'attività della GPU e gli eventi marcatori.It also displays GPU activity and marker events.

L'asse x della sequenza temporale rappresenta il tempo mentre sull'asse y sono riportati diversi canali:On the timeline, the x-axis is time, and on the y-axis are several channels:

  • Due canali di I/O per ogni unità disco del sistema, un canale per la lettura e uno per la scrittura.Two I/O channels for each disk drive on the system, one channel for reads and one for writes.
  • Un canale per ogni thread del processo.A channel for each thread in the process.
  • Canali dei marcatori, se nella traccia sono presenti eventi marcatori.Marker channels, if there are marker events in the trace. I canali dei marcatori vengono inizialmente visualizzati sotto i canali di thread che hanno generato tali eventi.Marker channels initially appear under the thread channels that generated those events.
  • Canali GPU.GPU channels.

Inizialmente i thread sono disposti nell'ordine in cui vengono creati, quindi il thread principale dell'app è il primo.Initially, threads are sorted in the order in which they're created, so the main app thread is first. Selezionare un'altra opzione nell'elenco a discesa Ordina per e ordinare i thread in base a un altro criterio, ad esempio Esecuzione.Select another option in the Sort by dropdown to sort threads by another criterion, such as Execution.

I colori della sequenza temporale indicano lo stato di un thread in un determinato momento.The timeline colors indicate the state of a thread at a given time. I segmenti verdi sono quelli in esecuzione, i segmenti rossi sono bloccati per la sincronizzazione, i segmenti gialli sono quelli con precedenza e i segmenti viola sono impegnati in operazioni di I/O del dispositivo.Green segments are executing, red segments are blocked for synchronization, yellow segments are preempted, and purple segments are engaged in device I/O.

È possibile fare zoom avanti per visualizzare altri dettagli oppure zoom indietro per visualizzare un intervallo di tempo più lungo.You can zoom in to view more detail, or zoom out to view a longer time interval. Selezionare segmenti e punti nel grafico per ottenere dettagli sulle categorie, gli orari di avvio, i ritardi e gli stati dello stack di chiamate.Select segments and points on the graph to get details about categories, start times, delays, and call stack states.

Usare la sequenza temporale per esaminare il bilanciamento del lavoro tra i thread coinvolti in un ciclo parallelo o in attività simultanee.Use the timeline to examine the work balance among threads that are involved in a parallel loop, or in concurrent tasks. Se un thread richiede più tempo per il completamento rispetto agli altri, il lavoro potrebbe essere sbilanciato.If one thread is taking longer to complete than the others, the work might be unbalanced. È possibile migliorare le prestazioni dell'app distribuendo il lavoro in modo più uniforme tra i thread.You might improve the performance of your app by distributing work more evenly among the threads.

Se in un determinato momento solo un thread è in esecuzione, l'app potrebbe non sfruttare completamente la concorrenza nel sistema.If only one thread is executing at a point in time, the app may not be taking full advantage of concurrency on the system. È possibile usare il grafico della sequenza temporale per esaminare le dipendenze tra thread e le relazioni temporali tra i thread di blocco e quelli bloccati.You can use the timeline graph to examine dependencies between threads, and the temporal relationships between blocking and blocked threads. Per riordinare i thread, selezionare un thread e quindi l'icona Su o Giù nella barra degli strumenti.To rearrange threads, select a thread, and then select the up or down icon on the toolbar.

È possibile nascondere i thread che non sono in funzione o sono completamente bloccati perché le relative statistiche sono irrilevanti e potrebbero intasare i rapporti.You can hide threads that are not doing work or are completely blocked, because their statistics are irrelevant and can clog the reports. Per nascondere i thread, selezionarne i nomi e quindi selezionare le icone Nasconde i thread selezionati oppure Nasconde tutto eccetto i thread selezionati nella barra degli strumenti.Hide threads by selecting their names and then selecting the Hide selected threads or Hide all except selected threads icons on the toolbar. Per identificare i thread da nascondere, selezionare il collegamento Riepilogo per thread in basso a sinistra.To identify threads to hide, select the Per Thread Summary link at lower left. È possibile nascondere i thread senza attività nel grafico Riepilogo per thread.You can hide the threads that have no activity in the Per Thread Summary graph.

Dettagli sull'esecuzione dei threadThread execution details

Per visualizzare informazioni più dettagliate su un segmento di esecuzione, selezionare un punto su un segmento verde della sequenza temporale.To get more detailed information about an execution segment, select a point on a green segment of the timeline. Il visualizzatore di concorrenza visualizza un cursore nero sopra il punto selezionato e ne indica lo stack di chiamate nella scheda Corrente del riquadro inferiore.The Concurrency Visualizer displays a black caret above the selected point, and shows its call stack on the Current tab of the bottom pane. È possibile selezionare più punti nel segmento di esecuzione.You can select multiple points on the execution segment.

Note

Il visualizzatore di concorrenza potrebbe non essere in grado di risolvere una selezione in un segmento di esecuzione se la durata del segmento è inferiore a un millisecondo.The Concurrency Visualizer might not be able to resolve a selection on an execution segment if the duration of the segment is less than one millisecond.

Per ottenere un profilo di esecuzione per tutti i thread non nascosti nell'intervallo di tempo attualmente selezionato, scegliere Esecuzione nella legenda in basso a sinistra.To get an execution profile for all unhidden threads in the currently selected time range, select Execution in the legend at lower left.

Dettagli sul blocco dei threadThread-blocking details

Per ottenere informazioni su una determinata area di un thread, passare il mouse sull'area nella sequenza temporale per visualizzare una descrizione comando,To get information about a particular region on a thread, hover over that region on the timeline to display a tooltip. che contiene diverse informazioni, tra cui categoria, ora di inizio e ritardo.The tooltip has information such as category, start time, and delay. Selezionare l'area per visualizzare lo stack di chiamate relativo a quel punto nel tempo nella scheda Corrente del riquadro inferiore.Select the region to display the call stack at that point in time in the Current tab of the bottom pane. Nel riquadro sono indicati anche la categoria, il ritardo, l'API di blocco, se presente, e l'eventuale thread di sblocco.The pane also shows category, delay, blocking API if there is one, and unblocking thread if there is one. Esaminando lo stack di chiamate, è possibile determinare i motivi sottostanti per gli eventi di blocco del thread.By examining the call stack, you can determine the underlying reasons for thread-blocking events.

Un percorso di esecuzione può avere alcuni eventi di blocco.An execution path may have several blocking events. Per esaminarli in base alla categoria di blocco e identificare le aree problematiche più rapidamente, selezionare una categoria di blocco nella legenda a sinistra.To examine these by blocking category and find problem areas more quickly, select a blocking category in the legend on the left.

Dipendenze tra threadDependencies between threads

Il visualizzatore di concorrenza visualizza le dipendenze tra i thread in modo da stabilire cosa stava tentando di eseguire un thread bloccato e quale altro thread abbia abilitato l'esecuzione.The Concurrency Visualizer shows dependencies between threads, so you can determine what a blocked thread was trying to do, and what other thread enabled it to execute.

Per determinare quale thread ha sbloccato un altro thread, selezionare il segmento di blocco nella sequenza temporale.To determine which thread unblocked another thread, select the blocking segment on the timeline. Se il visualizzatore di concorrenza è in grado di determinare il thread di sblocco, disegna una linea tra il thread di sblocco e il segmento di esecuzione che segue il segmento di blocco.If the Concurrency Visualizer can determine the unblocking thread, it draws a line between the unblocking thread and the executing segment that follows the blocking segment. Selezionare la scheda Stack di sblocco nel riquadro inferiore per visualizzare lo stack di chiamate pertinente.Select the Unblocking Stack tab in the bottom pane to see the relevant call stack.

Report dei profiliProfile reports

Il grafico della sequenza temporale che segue è un riquadro con le schede Rapporto profili, Corrente e Stack di sblocco del report.Below the timeline graph is a pane with Profile Report, Current, and Unblocking Stack report tabs. I report si aggiornano automaticamente quando si modifica la selezione della sequenza temporale e dei thread.The reports automatically update as you change the timeline and threads selections. Per le tracce di grandi dimensioni, il riquadro dei report può essere temporaneamente non disponibile durante il calcolo degli aggiornamenti.For large traces, the reports pane might be temporarily unavailable while updates are calculated.

Scheda Rapporto profiliProfile Report tab

La scheda Rapporto profili ha due filtri:The Profile Report has two filters:

  • Per escludere le voci dell'albero delle chiamate che hanno richiesto un tempo minimo, digitare un valore di filtro compreso tra 0 e 99% nel campo Riduzione rumore in.To filter out call tree entries where little time was spent, type a filter value between 0 and 99 percent in the Noise reduction at field. Il valore predefinito è 2%.The default value is 2 percent.
  • Per visualizzare solo gli alberi delle chiamate per il codice, selezionare la casella di controllo Just My Code.To view call trees for only your code, select the Just My Code check box. Per visualizzare tutti gli alberi delle chiamate, deselezionare la casella di controllo.To view all call trees, clear the check box.

La scheda Rapporto profili contiene i report per le categorie e i collegamenti nella legenda.The Profile Report tab shows reports for the categories and links in the legend. Per visualizzare un report, selezionare una delle voci a sinistra:To display a report, select one of the entries on the left:

  • Esecuzione Il report Esecuzione illustra il dettaglio del tempo che l'applicazione ha impiegato nell'esecuzione.Execution The Execution report shows the breakdown of the time the application spent in execution.

    Per trovare la riga di codice in cui è trascorso il tempo di esecuzione, espandere l'albero delle chiamate e scegliere Visualizza origine o Visualizza siti di chiamata dal menu di scelta rapida per la voce dell'albero delle chiamate.To find the line of code in which execution time is spent, expand the call tree and on the shortcut menu for the call tree entry, select View Source or View Call Sites. Visualizzazione origine consente di individuare la riga di codice eseguita.View Source locates the executed line of code. Visualizza siti di chiamata permette di individuare la riga di codice che ha chiamato la riga eseguita.View Call Sites locates the line of code that called the executed line. Se esiste una sola riga di sito di chiamata, viene evidenziato il codice corrispondente.If only one call site line exists, its code is highlighted. Se esistono diversi siti di chiamata, selezionarne uno nella finestra di dialogo e quindi selezionare Passa all'origine.If several call sites exist, select the one you want in the dialog box, and then select Go to source. È spesso molto utile individuare il sito di chiamata con il maggior numero di istanze, i tempi più elevati o entrambi.It's often most useful to locate the call site that has the most instances, the most time, or both. Per altre informazioni, vedere Report del profilo di esecuzione.For more information, see Execution profile report.

  • SincronizzazioneIl report Sincronizzazione illustra le chiamate responsabili dei blocchi di sincronizzazione, oltre ai tempi di blocco totali di ogni stack di chiamate.Synchronization The Synchronization report shows the calls that are responsible for synchronization blocks, along with the total blocking times of each call stack. Per altre informazioni, vedere Periodo di sincronizzazione.For more information, see Synchronization time.

  • I/O Il report I/O illustra le chiamate responsabili dei blocchi di I/O, oltre ai tempi di blocco totali di ogni stack di chiamate.I/O The I/O report shows the calls that are responsible for I/O blocks, along with the total blocking times of each call stack. Per altre informazioni, vedere Tempo di I/O (visualizzazione Thread).For more information, see I/O time (Threads view).

  • Sospensione Il report Sospensione illustra le chiamate responsabili dei blocchi di sospensione, oltre ai tempi di blocco totali di ogni stack di chiamate.Sleep The Sleep report shows the calls that are responsible for sleep blocks, along with the total blocking times of each call stack. Per altre informazioni, vedere Tempo di sospensione.For more information, see Sleep time.

  • Gestione della memoria Il report Gestione della memoria illustra le chiamate in cui si sono verificati blocchi di gestione della memoria, oltre ai tempi di blocco totali di ogni stack di chiamate.Memory Management The Memory Management report shows the calls where memory management blocks occurred, along with the total blocking times of each call stack. Usare queste informazioni per identificare le aree che presentano problemi notevoli di paging o di Garbage Collection.Use this information to identify areas that have excessive paging or garbage collection issues. Per altre informazioni, vedere Tempo di gestione della memoria.For more information, see Memory management time.

  • Precedenza Il report Precedenza indica dove i processi nel sistema hanno avuto la precedenza sul processo corrente e i singoli thread che hanno sostituito i thread del processo corrente.Preemption The Preemption report shows where processes on the system preempted the current process, and individual threads that replaced threads in the current process. È possibile usare queste informazioni per identificare i processi e i thread maggiormente responsabili della precedenza.You can use this information to identify the processes and threads that are most responsible for preemption. Per altre informazioni, vedere Tempo di precedenza.For more information, see Preemption time.

  • Elaborazione interfaccia utente Il report Elaborazione interfaccia utente indica le chiamate responsabili dei blocchi di elaborazione dell'interfaccia utente, oltre ai tempi di blocco totali di ogni stack di chiamate.UI Processing The UI Processing report shows the calls that are responsible for UI processing blocks, along with the total blocking times of each call stack. Per altre informazioni, vedere Tempo di elaborazione dell'interfaccia utente.For more information, see UI processing time.

  • Riepilogo per thread Selezionare Riepilogo per thread per visualizzare un grafo che illustra lo stato dei thread per l'intervallo di tempo attualmente selezionato.Per Thread Summary Select Per Thread Summary to display a graph showing the state of threads for the currently selected time interval. Le colonne di colori diversi indicano il tempo totale trascorso da ciascun thread nell'esecuzione, nel blocco, nell'I/O e in altri stati.The color-coded columns show the total time each thread spent in run, blocked, I/O and other states. I thread sono etichettati nella parte inferiore.The threads are labeled at the bottom. Quando si modifica il livello di zoom nel grafico della sequenza temporale, il grafico viene aggiornato automaticamente.When you adjust the zoom level in the timeline graph, this graph automatically updates.

    Con alcuni livelli di zoom, alcuni thread potrebbero non apparire nel grafico.At some zoom levels, some threads might not show in the graph. In questo caso, a destra vengono visualizzati puntini di sospensione (...).When this happens, ellipses (...) appear at the right. Se il thread desiderato non è presente, è possibile nascondere gli altri thread.If the thread you want does not appear, you can hide other threads. Per altre informazioni, vedere Report di riepilogo per thread.For more information, see Per thread summary report.

  • Operazioni su disco Selezionare Operazioni su disco per visualizzare i processi e i thread coinvolti in operazioni di I/O su disco per il processo corrente, i file interessati (ad esempio, le DLL caricate), il numero di byte letti e altre informazioni.Disk Operations Select Disk Operations to show processes and threads involved in disk I/O for the current process, files they touched (for example, DLLs they loaded), how many bytes they read, and other information. È possibile usare questo rapporto per valutare il tempo impiegato per accedere ai file durante l'esecuzione, specialmente se il processo sembra presentare vincoli di I/O.You can use this report to evaluate time spent accessing files during execution, especially when your process seems to be I/O-bound. Per altre informazioni, vedere Report delle operazioni su disco.For more information, see Disk operations report.

Scheda CorrenteCurrent tab

Questa scheda mostra lo stack di chiamate per un punto selezionato su un segmento di thread nel grafico della sequenza temporale.This tab shows the call stack for a selected point on a thread segment in the timeline graph. Gli stack di chiamate vengono tagliati per visualizzare solo l'attività correlata all'app.The call stacks are trimmed to show only activity that is related to your app.

Scheda Stack di sbloccoUnblocking Stack tab

Questa scheda indica quale thread ha sbloccato il thread selezionato e lo stack di chiamate di sblocco.This tab shows which thread unblocked the selected thread, and the unblocking call stack.

Vedere ancheSee also