Condividi tramite


Analisi della CPU

Questa guida fornisce tecniche dettagliate che è possibile usare per analizzare i problemi correlati alle unità di elaborazione centrale (CPU) che influisce sulle metriche di valutazione.

Le singole sezioni relative a metriche o problemi nelle guide all'analisi specifiche della valutazione identificano i problemi comuni per l'analisi. Questa guida fornisce tecniche e strumenti che è possibile usare per analizzare tali problemi.

Le tecniche descritte in questa guida usano Windows analizzatore prestazioni (WPA) di Windows Performance Toolkit (WPT). WPT fa parte di Windows Assessment and Deployment Kit (Windows ADK) e può essere scaricato dal Programma Windows Insider. Per altre informazioni, vedere Informazioni di riferimento tecnico su Windows Performance Toolkit.

Questa guida è organizzata nelle tre sezioni seguenti:

Background

Questa sezione descrive come vengono gestite le risorse della CPU in Windows 10.

Strumenti di Windows ADK

Questa sezione illustra come visualizzare e interpretare le informazioni sulla CPU in Windows ADK Toolkit.

Tecniche

Questa sezione contiene una raccolta di tecniche che è possibile usare per analizzare e risolvere i problemi comuni correlati alle prestazioni della CPU.

Sfondo

Questa sezione contiene descrizioni semplici e una discussione di base sulle prestazioni della CPU. Per uno studio più completo su questo argomento, ti consigliamo di prenotare Windows Internals, Fifth Edition.

I computer moderni possono contenere più CPU installate in socket separati. Ogni CPU può ospitare più core del processore fisico, ognuno in grado di elaborare uno o due flussi di istruzioni separati contemporaneamente. Questi singoli processori del flusso di istruzioni vengono gestiti dal sistema operativo Windows come processori logici.

In questa guida, sia il processore che la CPU fanno riferimento a un processore logico, ovvero un dispositivo hardware che il sistema operativo può usare per eseguire le istruzioni del programma.

Windows 10 gestisce attivamente l'hardware del processore in due modi principali: risparmio energia, bilanciare il consumo energetico e le prestazioni e l'utilizzo per bilanciare i requisiti di elaborazione dei programmi e dei driver.

Risparmio energia processore

I processori non esistono sempre in uno stato operativo. Quando non sono disponibili istruzioni per l'esecuzione, Windows inserisce un processore in uno stato di inattività di destinazione (o C-State), come determinato da Windows Power Manager. In base ai modelli di utilizzo della CPU, lo stato C di destinazione di un processore verrà regolato nel tempo.

Gli stati di inattività sono stati numerati da C0 (attivo, non inattiva) attraverso stati di potenza progressivamente inferiori. Questi stati includono C1 (interrotto ma l'orologio è ancora abilitato), C2 (interrotto e l'orologio è disabilitato) e così via. L'implementazione degli stati inattivi è specifica del processore. Tuttavia, un numero di stato superiore in tutti i processori riflette un consumo di energia inferiore, ma anche un tempo di attesa più lungo prima che il processore possa tornare all'elaborazione delle istruzioni. Il tempo trascorso in stati di inattività influisce significativamente sull'utilizzo dell'energia e sulla durata della batteria.

Alcuni processori possono operare in stati di prestazioni (P-) e di limitazione (T-) anche quando elaborano attivamente le istruzioni. Gli stati P definiscono le frequenze di clock e i livelli di tensione supportati dal processore. Gli stati T non modificano direttamente la frequenza di clock, ma possono ridurre la velocità effettiva del clock ignorando l'attività di elaborazione su una frazione di tick di clock. Insieme, gli stati P- e T- correnti determinano la frequenza operativa effettiva del processore. Le frequenze inferiori corrispondono a prestazioni inferiori e a un consumo di energia inferiore.

Windows Power Manager determina uno stato P e T appropriato per ogni processore, in base ai modelli di utilizzo della CPU e ai criteri di alimentazione del sistema. Il tempo impiegato in stati ad alte prestazioni rispetto agli stati a prestazioni ridotte influisce significativamente sull'utilizzo dell'energia e sulla durata della batteria.

Gestione utilizzo processore

Windows usa tre astrazioni principali per gestire l'utilizzo del processore.

  • Processi

  • Threads

  • Chiamate di procedure posticipate (DPC) e routine del servizio di interruzione (ISR)

Processi e thread

Tutti i programmi in modalità utente in Windows vengono eseguiti nel contesto di un processo. Un processo include gli attributi e i componenti seguenti:

  • Uno spazio indirizzi virtuale

  • Classe Priority

  • Moduli di programma caricati

  • Informazioni sull'ambiente e sulla configurazione

  • Almeno un thread

Anche se i processi contengono i moduli di programma, il contesto e l'ambiente, non vengono pianificati direttamente per l'esecuzione in un processore. I thread di proprietà di un processo vengono invece pianificati per l'esecuzione in un processore.

Un thread gestisce le informazioni sul contesto di esecuzione. Quasi tutto il calcolo viene gestito come parte di un thread. L'attività del thread influisce fondamentalmente sulle misurazioni e sulle prestazioni del sistema.

Poiché il numero di processori in un sistema è limitato, non è possibile eseguire tutti i thread contemporaneamente. Windows implementa la condivisione del tempo del processore, che consente l'esecuzione di un thread per un periodo di tempo prima che il processore passi a un altro thread. L'atto di passare da un thread all'altro viene chiamato cambio di contesto e viene eseguito da un componente di Windows denominato dispatcher. Il dispatcher prende decisioni di pianificazione dei thread in base alla priorità, al processore ideale e all'affinità, al quantum e allo stato.

Priorità

La priorità è un fattore chiave nel modo in cui il dispatcher seleziona il thread da eseguire. La priorità del thread è un numero intero compreso tra 0 e 31. Se un thread è eseguibile e ha una priorità più alta rispetto a un thread attualmente in esecuzione, il thread con priorità inferiore viene immediatamente superato e il thread con priorità più alta passa al contesto.

Quando un thread è in esecuzione o è pronto per l'esecuzione, non è possibile eseguire thread con priorità inferiore, a meno che non siano presenti processori sufficienti per eseguire entrambi i thread contemporaneamente o, a meno che il thread con priorità più alta non sia limitato all'esecuzione solo su un subset di processori disponibili. I thread hanno una priorità di base che può essere temporaneamente elevata a priorità più elevate in determinati momenti: ad esempio, quando il processo è proprietario della finestra in primo piano o quando viene completato un I/O.

Processore e affinità ideali

L'affinità e il processore ideali di un thread determinano i processori in cui è pianificato l'esecuzione di un determinato thread. Ogni thread ha un processore ideale impostato dal programma o automaticamente da Windows. Windows usa una metodologia round robin in modo che a ogni processore venga assegnato un numero approssimativamente uguale di thread in ogni processo. Quando possibile, Windows pianifica l'esecuzione di un thread sul processore ideale; Tuttavia, il thread può occasionalmente essere eseguito su altri processori.

L'affinità del processore di un thread limita i processori in cui verrà eseguito un thread. Si tratta di una restrizione più forte rispetto all'attributo del processore ideale del thread. Il programma imposta l'affinità usando SetThreadAffinityMask. L'affinità può impedire l'esecuzione di thread in processori specifici.

Quantum

I commutatori di contesto sono operazioni costose. Windows consente in genere l'esecuzione di ogni thread per un periodo di tempo chiamato quantum prima che passi a un altro thread. La durata quantistica è progettata per mantenere la velocità di risposta apparente del sistema. Ottimizza la velocità effettiva riducendo al minimo il sovraccarico del cambio di contesto. Le durate quantistiche possono variare tra client e server. Le durate quantistiche sono in genere più lunghe in un server per ottimizzare la velocità effettiva a scapito della velocità di risposta apparente. Nei computer client Windows assegna quantistici più brevi nel complesso, ma fornisce un quantum più lungo al thread associato alla finestra in primo piano corrente.

Provincia

Ogni thread esiste in uno stato di esecuzione specifico in qualsiasi momento. Windows usa tre stati rilevanti per le prestazioni; sono: In esecuzione, Pronto e In attesa.

I thread attualmente in esecuzione si trovano nello stato In esecuzione . I thread che possono essere eseguiti ma che non sono attualmente in esecuzione sono nello stato Pronto . I thread che non possono essere eseguiti perché sono in attesa di un determinato evento sono nello stato In attesa .

Uno stato di transizione dello stato è illustrato nella figura 1 Transizioni di stato del thread:

Figura 1 transizione dello stato del thread

Figura 1 Transizioni di stato del thread

La figura 1 Transizioni di stato del thread è illustrata di seguito:

  1. Un thread nello stato In esecuzione avvia una transizione allo stato In attesa chiamando una funzione di attesa, ad esempio WaitForSingleObject o Sleep(> 0).

  2. Un'operazione di thread o kernel in esecuzione legge un thread nello stato In attesa ( ad esempio, Scadenza setEvent o timer). Se un processore è inattiva o se il thread letto ha una priorità più alta rispetto a un thread attualmente in esecuzione, il thread letto può passare direttamente allo stato In esecuzione. In caso contrario, viene inserito nello stato Pronto.

  3. Un thread nello stato Pronto è pianificato per l'elaborazione da parte del dispatcher quando un thread in esecuzione attende, restituisce (Sleep(0)) o raggiunge la fine del relativo quantum.

  4. Un thread nello stato In esecuzione viene disattivato e inserito nello stato Ready dal dispatcher quando viene preceduto da un thread con priorità più alta, restituisce (Sleep(0)) o quando termina il quantum.

Un thread presente nello stato In attesa non indica necessariamente un problema di prestazioni. La maggior parte dei thread impiega molto tempo nello stato In attesa, che consente ai processori di immettere stati di inattività e risparmiare energia. Lo stato del thread diventa un fattore importante nelle prestazioni solo quando un utente è in attesa del completamento di un'operazione da parte di un thread.

DPC e ISR

Oltre all'elaborazione dei thread, i processori rispondono alle notifiche provenienti da dispositivi hardware, ad esempio schede di rete o timer. Quando un dispositivo hardware richiede attenzione al processore, genera un interrupt. Windows risponde a un interrupt hardware sospendendo un thread attualmente in esecuzione ed eseguendo l'ISR associato all'interrupt.

Durante il tempo in cui esegue un ISR, è possibile impedire a un processore di gestire qualsiasi altra attività, incluse altre interruzioni. Per questo motivo, gli ISR devono completare rapidamente o le prestazioni del sistema possono peggiorare. Per ridurre il tempo di esecuzione, gli ISR pianificano in genere i controller di dominio per eseguire operazioni che devono essere eseguite in risposta a un interrupt. Per ogni processore logico, Windows gestisce una coda di CONTROLLER di dominio pianificati. I controller di dominio hanno la priorità sui thread a qualsiasi livello di priorità. Prima che un processore torni a elaborare i thread, esegue tutti i CONTROLLER di dominio nella coda.

Durante il tempo in cui un processore esegue controller di rete e isr, nessun thread può essere eseguito su tale processore. Questa proprietà può causare problemi per i thread che devono eseguire operazioni a una determinata velocità effettiva o con tempi precisi, ad esempio un thread che riproduce audio o video. Se il tempo del processore usato per eseguire controller di dominio e isr impedisce a questi thread di ricevere tempo di elaborazione sufficiente, il thread potrebbe non raggiungere la velocità effettiva necessaria o completare gli elementi di lavoro in tempo.

Strumenti di Windows ADK

Windows ADK scrive informazioni e valutazioni hardware nei file dei risultati delle valutazioni. WPA fornisce informazioni dettagliate sull'utilizzo della CPU in vari grafici. Questa sezione illustra come usare Windows ADK e WPA per raccogliere, visualizzare e analizzare i dati sulle prestazioni della CPU.

File dei risultati della valutazione di Windows ADK

Poiché Windows supporta solo sistemi multiprocesso simmetrico, tutte le informazioni contenute in questa sezione si applicano a tutte le CPU e i core installati.

Le informazioni dettagliate sull'hardware EcoSysInfo della CPU sono disponibili nella sezione dei file dei risultati di una valutazione nel <Processor><Instance id=”0”> nodo.

Ad esempio:

<Processor>
  <Instance id="0">
    <ProcessorName>The name of the first CPU</ProcessorName>
    <TSCFrequency>The maximum frequency of the first CPU</TSCFrequency>
    <NumProcs>The total number of processors</NumProcs>
    <NumCores>The total number of cores</NumCores>
    <NumCPUs>The total number of logical processors</NumCPUs>
    ...and so on...

Grafici WPA

Dopo aver caricato una traccia in WPA, è possibile trovare informazioni sull'hardware del processore nelle sezioni Trace/System Configuration/General e Trace/System Configuration/PnP dell'interfaccia utente WPA.

Nota Tutte le procedure in questa guida si verificano in WPA.

Grafico stati di inattività CPU

Se le informazioni sullo stato inattive vengono raccolte in una traccia, il grafico Power/CPU Idle States verrà visualizzato nell'interfaccia utente WPA. Questo grafico contiene sempre i dati sullo stato di inattività di destinazione per ogni processore. Il grafico conterrà anche informazioni sullo stato di inattività effettivo di ogni processore se questo stato è supportato dal processore.

Ogni riga della tabella seguente descrive una modifica dello stato di inattività per lo stato target o effettivo di un processore. Per ogni riga del grafico sono disponibili le colonne seguenti:

Colonna Dettagli

CPU

Processore interessato dalla modifica dello stato.

Ora di ingresso

Ora in cui il processore ha immesso lo stato di inattività.

Ora di uscita

Ora in cui il processore ha chiuso lo stato di inattività.

Max:Duration(ms)

Tempo trascorso nello stato di inattività (aggregazione predefinita:maximum).

Min:Duration(ms)

Tempo trascorso nello stato di inattività (aggregazione predefinita:minimum).

Stato successivo

Stato a cui è stata eseguita la transizione del processore dopo lo stato corrente.

Stato prev

Stato da cui è stata eseguita la transizione del processore prima dello stato corrente.

Provincia

Stato di inattività corrente.

Stato (numerico)

Stato di inattività corrente come numero (ad esempio, 0 per C0).

Sum:Duration(ms)

Tempo trascorso nello stato di inattività (aggregazione predefinita:sum).

Tabella

Inutilizzati

Type

Target (per lo stato di destinazione selezionato di Power Manager per il processore) o Actual (per lo stato di inattività effettivo del processore).

Il profilo WPA predefinito fornisce due set di impostazioni per questo grafico: Stato per tipo, CPU e diagramma di stato per tipo, CPU.

Stato per tipo, CPU

Gli stati Target e Actual di ogni CPU vengono grafici insieme al numero di stato sull'asse Y nel grafico Stato per tipo, CPU . Figura 2 Stati di inattività CPU per tipo, CPU mostra lo stato effettivo della CPU mentre fluttua tra stati di inattività attivo e di destinazione.

figura 2 stati di inattività cpu per tipo cpu

Figura 2 Stati di inattività CPU per tipo, CPU

Diagramma dello stato per tipo, CPU

In questo grafico gli stati Target e Actual di ogni CPU vengono presentati in formato sequenza temporale. Ogni stato ha una riga separata nella sequenza temporale. Figura 3 Diagramma stato di inattività CPU per tipo, CPU mostra gli stessi dati della figura 2 Stati di inattività CPU per tipo, CPU, in una visualizzazione sequenza temporale.

Figura 3 diagramma dello stato di inattività cpu per tipo CPU

Figura 3 Diagramma dello stato di inattività CPU per tipo, CPU

Grafico frequenza CPU

Se i dati sulla frequenza della CPU sono stati raccolti in un sistema che supporta più stati P o T, il grafico Frequenza CPU sarà disponibile nell'interfaccia utente wpa. Ogni riga nella tabella seguente rappresenta l'ora a un determinato livello di frequenza per un processore. La colonna Frequency (MHz) contiene un numero limitato di frequenze corrispondenti agli stati P e T supportati dal processore. Per ogni riga del grafico sono disponibili le colonne seguenti:

Colonna Dettagli

% Durata

La durata viene espressa come percentuale del tempo totale della CPU nel periodo di tempo attualmente visibile.

Count

Numero di modifiche di frequenza (sempre 1 per singole righe).

CPU

CPU interessata dalla modifica della frequenza.

Ora di ingresso

Ora in cui la CPU ha immesso lo stato P.

Ora di uscita

Ora in cui la CPU ha chiuso lo stato P.

Frequenza (MHz)

Frequenza della CPU durante il tempo in cui si trova nello stato P.

Max:Duration(ms)

Tempo trascorso nello stato P (aggregazione predefinita:maximum).

Min:Duration(ms)

Tempo impiegato nello stato P (aggregazione predefinita:minimum).

Sum:Duration(ms)

Tempo trascorso nello stato P (aggregazione predefinita:sum).

Tabella

Inutilizzati

Type

Informazioni aggiuntive sullo stato P.

Il profilo predefinito definisce il set di impostazioni Frequenza per CPU per questo grafico. La figura 4 Frequenza CPU per CPU mostra una CPU durante la transizione tra tre stati P:

figura 4 frequenza cpu per CPU

Figura 4 Frequenza CPU per CPU

Grafico utilizzo CPU (campionato)

I dati visualizzati nel grafico Utilizzo CPU (Campionato) rappresentano campioni di attività della CPU eseguite a intervalli regolari di campionamento. Nella maggior parte delle tracce, si tratta di un millisecondo (1 ms). Ogni riga della tabella rappresenta un singolo esempio.

Il peso del campione rappresenta il significato del campione, rispetto ad altri campioni. Il peso è uguale al timestamp dell'esempio corrente meno il timestamp dell'esempio precedente. Il peso non è sempre esattamente uguale all'intervallo di campionamento a causa delle fluttuazioni dello stato e dell'attività del sistema.

La figura 5 Campionamento CPU rappresenta la modalità di raccolta dei dati:

figura 5 campionamento cpu

Figura 5 Campionamento CPU

Qualsiasi attività cpu che si verifica tra campioni non viene registrata da questo metodo di campionamento. Di conseguenza, le attività di durata molto breve, ad esempio dpcs e ISR, non sono ben rappresentate nel grafico di campionamento della CPU.

Per ogni riga del grafico sono disponibili le colonne seguenti:

Colonna Dettagli

% peso

Il peso viene espresso come percentuale del tempo totale della CPU impiegato nell'intervallo di tempo attualmente visibile.

Address

Indirizzo di memoria della funzione che si trova all'inizio dello stack.

Totale conteggio

Numero di campioni rappresentati da una riga. Questo numero include campioni acquisiti quando un processore è inattiva. Per le singole righe, questa colonna è sempre 1.

Count

Numero di campioni rappresentati da una riga, esclusi i campioni acquisiti quando un processore è inattiva. Per le singole righe, questa colonna è sempre 1 (o 0, per i casi in cui la CPU era in uno stato di basso consumo).

CPU

Indice in base 0 della CPU in cui è stato acquisito questo esempio.

Nome visualizzato

Nome visualizzato del processo attivo.

DPC/ISR

Indica se il campione ha misurato l'utilizzo regolare della CPU, un DPC/ISR o uno stato a basso consumo.

Funzione

Funzione nella parte superiore dello stack.

Modulo

Modulo che contiene la funzione nella parte superiore dello stack.

Priorità

Priorità del thread in esecuzione.

Processo

Nome dell'immagine del processo proprietario del codice in esecuzione.

Nome processo

Nome completo (incluso l'ID processo) del processo proprietario del codice in esecuzione.

Stack

Stack del thread in esecuzione.

ID thread

ID del thread in esecuzione.

Funzione Di avvio thread

Funzione con cui è stato avviato il thread in esecuzione.

Modulo di avvio thread

Modulo che contiene la funzione di avvio thread.

TimeStamp

Ora in cui è stato eseguito il campione.

Peso

Tempo (in millisecondi) rappresentato dall'esempio (ovvero l'ora dell'ultimo campione).

Il profilo predefinito fornisce i set di impostazioni seguenti per questo grafico:

  • Utilizzo per CPU

  • Utilizzo per priorità

  • Utilizzo per processo

  • Utilizzo per processo e thread

Utilizzo per CPU

Il grafico Utilizzo UTILIZZO CPU per CPU mostra come viene distribuito il lavoro tra processori. La figura 6 Utilizzo utilizzo CPU per CPU mostra questa distribuzione per due CPU:

Figura 6 utilizzo cpu per CPU

Figura 6 Utilizzo CPU per CPU

Utilizzo per priorità

L'utilizzo della CPU raggruppato per priorità thread mostra in che modo i thread con priorità alta influisce su thread con priorità più bassa. La figura 7 Utilizzo CPU (Sampled) Usage by Priority (Sampled) Usage by Priority (Utilizzo cpu campionato per priorità) visualizza questo grafico:

Figura 7 utilizzo cpu campionato per priorità

Figura 7 Utilizzo CPU (campionato) per priorità

Utilizzo per processo

L'utilizzo della CPU raggruppato per processo mostra l'utilizzo relativo dei processi. La figura 8 Utilizzo CPU (sampled) Usage by Process mostra questo set di impostazioni. In questo grafico di esempio viene mostrato che un processo richiede più tempo della CPU rispetto agli altri processi.

Figura 8 utilizzo cpu campionato per processo

Figura 8 Utilizzo CPU (campionato) utilizzo per processo

Utilizzo per processo e thread

Utilizzo CPU raggruppato per processo e quindi raggruppato per thread mostra l'utilizzo relativo dei processi e i thread in ogni processo. La figura 9 Utilizzo CPU (campionato) per processo e thread mostra questo set di impostazioni. I thread di un singolo processo vengono selezionati in questo grafico.

Figura 9 utilizzo cpu campionato per processo

Figura 9 Utilizzo CPU (campionato) per processo e thread

Grafico utilizzo CPU (preciso)

Il grafico Utilizzo CPU (Preciso) registra le informazioni associate agli eventi di cambio del contesto. Ogni riga rappresenta un set di dati associati a un singolo commutatore di contesto; ovvero all'avvio di un thread. I dati vengono raccolti per la sequenza di eventi seguente:

  1. Il nuovo thread viene spento.

  2. Il nuovo thread è pronto per l'esecuzione dal thread pronto.

  3. Il nuovo thread viene scambiato, in modo da disattivare un vecchio thread.

  4. Il nuovo thread viene nuovamente disattivato.

Nella figura 10 diagramma preciso utilizzo CPU il tempo passa da sinistra a destra. Le etichette del diagramma corrispondono ai nomi di colonna nel grafico Utilizzo CPU (Preciso). Le etichette per le colonne Timestamp vengono visualizzate nella parte superiore del diagramma e le etichette per le colonne Intervallo durata vengono visualizzate nella parte inferiore del diagramma.

figura 10 diagramma preciso dell'utilizzo della CPU

Figura 10 Diagramma preciso utilizzo CPU

Le interruzioni nella sequenza temporale nella figura 10 Diagramma preciso utilizzo CPU dividono la sequenza temporale in aree che possono verificarsi contemporaneamente su CPU diverse. Queste sequenze temporali possono sovrapporsi a condizione che l'ordine degli eventi numerati non venga modificato. Ad esempio, il thread Readying può essere eseguito in Processor-2 contemporaneamente all'uscita di un nuovo thread e quindi di nuovo in Processor-1.

Le informazioni vengono registrate per le quattro destinazioni seguenti nella sequenza temporale:

  • Nuovo thread, ovvero il thread che è stato attivato. È l'obiettivo principale di questa riga nel grafico.

  • Thread NewPrev, che fa riferimento all'ora precedente in cui il nuovo thread è stato attivato.

  • Thread pronto, ovvero il thread che ha preparato il nuovo thread da elaborare.

  • Thread precedente, ovvero il thread che è stato disattivato quando il nuovo thread è stato attivato.

I dati nella tabella seguente sono correlati a ogni thread di destinazione:

Colonna Dettagli

% utilizzo CPU

Utilizzo della CPU del nuovo thread dopo il cambio. Questo valore viene espresso come percentuale del tempo totale della CPU nel periodo di tempo attualmente visibile.

Count

Numero di opzioni di contesto rappresentate dalla riga. Si tratta sempre di 1 per singole righe.

Count:Waits

Numero di attese rappresentate dalla riga. Si tratta sempre di 1 per singole righe tranne quando un thread viene passato a uno stato di inattività; in questo caso, è impostato su 0.

CPU

CPU in cui si è verificato il cambio di contesto.

Utilizzo CPU (ms)

Utilizzo della CPU del nuovo thread dopo il cambio di contesto. È uguale a NewInSwitchTime, ma viene visualizzato in millisecondi.

IdealCpu

CPU ideale selezionata dall'utilità di pianificazione per il nuovo thread.

LastSwitchOutTime (s)

L'ora precedente in cui il nuovo thread è stato spento.

NewInPri

Priorità del nuovo thread che viene attivato.

NewInSwitchTime(s)

NextSwitchOutTime(s) meno SwitchInTime(s)

NewOutPri

Priorità del nuovo thread quando viene disattivata.

NewPrevOutPri

Priorità del nuovo thread quando è stata disattivata in precedenza.

NewPrevState

Stato del nuovo thread dopo che è stato precedentemente disattivato.

NewPrevWaitMode

Modalità di attesa del nuovo thread quando è stata disattivata in precedenza.

NewPrevWaitReason

Motivo per cui il nuovo thread è stato disattivato.

NewPriDecr

Boost di priorità che influisce sul thread.

NewProcess

Processo del nuovo thread.

Nome NewProcess

Nome del processo del nuovo thread, incluso PID.

NewQnt

Non utilizzato.

NewState

Stato del nuovo thread dopo che è stato attivato.

NewThreadId

ID thread del nuovo thread.

NewThreadStack

Stack del nuovo thread quando viene attivato.

NewThreadStartFunction

Funzione iniziale del nuovo thread.

NewThreadStartModule

Modulo iniziale del nuovo thread.

NewWaitMode

Modalità di attesa del nuovo thread.

NewWaitReason

Motivo per cui il nuovo thread è stato disattivato.

NextSwitchOutTime(s)

Ora in cui il nuovo thread è stato spento.

OldInSwitchTime(s)

L'ora in cui il vecchio thread era passato prima che fosse spento.

OldOutPri

Priorità del thread precedente quando è stata disattivata.

OldProcess

Processo proprietario del thread precedente.

Nome OldProcess

Nome del processo proprietario del thread precedente, incluso IL PID.

OldQnt

Non utilizzato.

OldState

Stato del thread precedente dopo che è stato disattivato.

OldThreadId

ID thread del thread precedente.

OldThreadStartFunction

Funzione iniziale del thread precedente.

OldThreadStartModule

Modulo iniziale del thread precedente.

OldWaitMode

Modalità di attesa del thread precedente.

OldWaitReason

Motivo per cui il thread precedente è stato spento.

PrevCState

CState precedente del processore. Se non è 0 (Attivo), il processore si trovava in uno stato di inattività prima che il nuovo thread sia stato spostato nel contesto.

Pronto/i

SwitchInTime(s) minusReadyTime (s)

Readying ThreadId

ID thread del thread pronto.

Readying ThreadStartFunction

Funzione iniziale del thread pronto.

Readying ThreadStartModule

Modulo iniziale del thread di preparazione.

ReadyingProcess

Processo proprietario del thread di preparazione.

Nome ReadyingProcess

Nome del processo proprietario del thread di preparazione, incluso IL PID.

ReadyThreadStack

Stack del thread di preparazione.

ReadyTime (s)

Ora in cui il nuovo thread è stato letto.

SwitchInTime(s)

Ora in cui è stato attivato il nuovo thread.

TimeSinceLast (s)

SwitchInTime(s) meno LastSwitchOutTime (s)

Attese (s)

ReadyTime (s) meno LastSwitchOutTime (s)

Il profilo predefinito usa i set di impostazioni seguenti per questo grafico:

  • Sequenza temporale per CPU

  • Sequenza temporale per processo, thread

  • Utilizzo per priorità all'inizio del cambio di contesto

  • Utilizzo per CPU

  • Utilizzo per processo, thread

Sequenza temporale per CPU

L'utilizzo della CPU in una sequenza temporale per CPU mostra come il lavoro viene distribuito tra i processori. Figura 11 Sequenza temporale utilizzo CPU (precisa) per CPU visualizza la sequenza temporale in un sistema a otto processori:

figura 11 sequenza temporale precisa dell'utilizzo della CPU in base alla CPU

Figura 11 Sequenza temporale utilizzo CPU (precisa) per CPU

Sequenza temporale per processo, thread

L'utilizzo della CPU in una sequenza temporale per processo, per thread, mostra i processi con thread in esecuzione in determinati momenti. Figura 12 Sequenza temporale di utilizzo (precisa) per processo, thread mostra questa sequenza temporale in diversi processi:

Figura 12 sequenza temporale precisa dell'utilizzo in base al thread del processo

Figura 12 Sequenza temporale di utilizzo (precisa) per processo, thread

Utilizzo per priorità all'inizio del cambio di contesto

Questo grafico identifica i picchi di attività di thread ad alta priorità a ogni livello di priorità. La figura 13 Utilizzo CPU (preciso) utilizzo per priorità in Inizio cambio di contesto mostra la distribuzione delle priorità:

figura 13 utilizzo della CPU preciso per priorità in c

Figura 13 Utilizzo CPU (preciso) per priorità all'inizio del cambio di contesto

Utilizzo per CPU

In questo grafico, l'utilizzo della CPU viene raggruppato e grafo in base alla CPU per mostrare come il lavoro viene distribuito tra i processori. La figura 14 Utilizzo CPU (preciso) per CPU mostra questo grafico per un sistema con otto processori.

figura 14 utilizzo preciso cpu per CPU

Figura 14 Utilizzo CPU (preciso) per CPU

Utilizzo per processo, thread

In questo grafico l'utilizzo della CPU viene raggruppato per primo per processo e quindi per thread. Mostra l'utilizzo relativo dei processi e i thread in ogni processo Figura 15 Utilizzo CPU (preciso) utilizzo per processo. Il thread mostra questa distribuzione tra più processi:

figura 15 utilizzo cpu preciso utilizzo per processo

Figura 15 Utilizzo CPU (preciso) per processo, thread

Grafico DPC/ISR

Il grafico DPC/ISR è l'origine primaria per le informazioni DPC/ISR in WPA. Ogni riga del grafico rappresenta un frammento, ovvero un periodo di tempo durante il quale un DPC o UN ISR è stato eseguito senza interruzioni. I dati vengono raccolti all'inizio e alla fine dei frammenti. I dati aggiuntivi vengono raccolti al termine di un DPC/ISR. La figura 16 DPC/ISR Diagramma mostra come funziona:

Figura 16 dpc isr diagramma

Figura 16 Diagramma DPC/ISR

La figura 16 DPC/ISR Diagramma descrive i dati raccolti durante le attività seguenti:

  1. DPC/ISR-A inizia a essere eseguito.

  2. Un interrupt del dispositivo con un livello di interrupt superiore rispetto a DPC/ISR-A causa dell'interruzione di DPC/ISR A, terminando così il primo frammento di DPC/ISR-A.

  3. ISR-B viene completato e quindi termina il frammento di ISR-B. DPC/ISR-A riprende l'esecuzione in un secondo frammento.

  4. DPC/ISR-A viene completato, terminando così il secondo frammento di DPC/ISR-A.

Nella tabella dati viene visualizzata una riga per ogni frammento. I frammenti per DPC/ISR-A condividono informazioni identiche con colonne non frammentate.

Le colonne per il grafico DPC/ISR descrivono le informazioni a livello di frammento o le colonne a livello DPC/ISR. Ogni frammento di dati diversi in colonne a livello di frammento e dati identici nelle colonne DPC/ISR.

Colonna Dettagli

% Durata (frammentata)

Durata (frammentata) espressa come percentuale del tempo totale della CPU nel periodo di tempo attualmente visibile.

% Durata esclusiva

Durata esclusiva espressa come percentuale del tempo totale della CPU nel periodo di tempo attualmente visibile.

% durata inclusiva

Durata inclusiva espressa come percentuale del tempo totale della CPU nel periodo di tempo attualmente visibile.

Address

Indirizzo di memoria della funzione DPC o ISR.

Conteggio (DPCs/ISR)

Numero di dpc/ISR rappresentati da questa riga. Si tratta sempre di 1 per le righe che rappresentano il frammento finale di un DPC/ISR; in caso contrario, questo conteggio è 0.

Conteggio (frammenti)

Numero di frammenti rappresentati dalla riga. Si tratta sempre di 1 per singole righe.

CPU

Indice del processore logico in cui è stato eseguito DPC o ISR.

Tipo DPC

Per DPC, il tipo di DPC, regolare o timer. Questo valore è vuoto per un ISR.

DPC/ISR Enter Time (s)

Ora dell'avvio di DPC/ISR nella traccia.

DPC/ISR Exit Time (s)

Ora dall'inizio della traccia al completamento di DPC/ISR.

Durata (frammentata) (ms)

Tempo di uscita frammento (s) meno tempo di immissione frammento (s) in millisecondi.

Durata esclusiva (ms)

Somma delle durate frammentate in ms. per tutti i frammenti di questo DPC/ISR.

Frammento

Se il DPC/ISR di questa riga contiene più frammenti, questo valore è True; in caso contrario, è False.

Frammento

Se questo non è l'unico frammento per questo DPC/ISR, questo valore è True; in caso contrario, è False.

Tempo di immissione frammento (s)

Ora di avvio dell'esecuzione del frammento.

Tempo di uscita frammento (s)

Ora in cui il frammento ha interrotto l'esecuzione.

Funzione

Funzione DPC o ISR eseguita.

Durata inclusiva (ms)

DPC/ISR Exit Time (s) meno DPC/ISR Enter Time (s) in millisecondi.

MessageIndex

Indice di interrupt per gli interrupt con segnalazione di messaggi.

Modulo

Modulo che contiene la funzione DPC o ISR.

Valore restituito

Valore restituito di DPC/ISR

Type

Tipo di evento; ovvero DPC o Interrupt (ISR).

Vettore

Valore del vettore di interrupt nel dispositivo.

Il profilo predefinito usa i set di impostazioni seguenti per questo grafico:

  • [DPC,ISR,DPC/ISR] Durata per CPU

  • [DPC,ISR,DPC/ISR] Duration by Module, Function

  • [DPC,ISR,DPC/ISR] Sequenza temporale per modulo, funzione

[DPC,ISR,DPC/ISR] Durata per CPU

Gli eventi DPC/ISR vengono aggregati dalla CPU in cui sono stati eseguiti e ordinati in base alla durata. Questo grafico mostra l'allocazione dell'attività DPC tra CPU. La figura 17 DPC/ISR Duration by CPU mostra questo grafico per un sistema con otto processori.

figura 17 dpc isr duration by cpu

Figura 17 Durata DPC/ISR per CPU

[DPC,ISR,DPC/ISR] Duration by Module, Function

Gli eventi DPC/ISR vengono aggregati in questo grafico in base al modulo e alla funzione delle routine DPC/ISR e vengono ordinati in base alla durata. Ciò mostra quali routine DPC/ISR hanno utilizzato la figura più tempo 18 DPC/ISR Duration by Module, Function mostra un periodo di tempo che comporta l'attività DPC/ISR in due moduli:

figura 18 dpc isr duration by module function

Figura 18 Durata DPC/ISR per modulo, funzione

[DPC,ISR,DPC/ISR] Sequenza temporale per modulo, funzione

Gli eventi DPC/ISR vengono aggregati in questo grafico dal modulo e dalla funzione delle routine DPC/ISR. Vengono grafici come sequenza temporale. Questo grafico fornisce una visualizzazione dettagliata del periodo di tempo in cui sono stati eseguiti i DPC/ISR. Questo grafico può anche mostrare come possono essere frammentati singoli DPC/ISR. Figura 19 DPC/ISR Timeline by Module, Function mostra una sequenza temporale dell'attività in tre moduli:

figura 19 dpc isr timeline by module function

Figura 19 Sequenza temporale DPC/ISR per modulo, funzione

Alberi dello stack

Gli alberi dello stack vengono visualizzati nelle tabelle Utilizzo CPU (Campionato), Utilizzo CPU (Preciso) e DPC/ISR in WPA e nei problemi segnalati nei report di valutazione. Gli alberi dello stack ritraggono gli stack di chiamate associati a più eventi in un periodo di tempo. Ogni nodo dell'albero rappresenta un segmento dello stack condiviso da un subset degli eventi. L'albero viene costruito dai singoli stack ed è illustrato nella figura 20 Stack di tre eventi:

figura 20 stack da tre eventi

Figura 20 Stack da tre eventi

La figura 21 Segmenti comuni identificati mostra come vengono identificate le sequenze comuni per questo grafico:

figura 21 segmenti comuni identificati

Figura 21 Segmenti comuni identificati

La figura 22 Tree Built from Stacks mostra come i segmenti comuni vengono combinati per formare i nodi di un albero:

figura 22 albero costruito da stack

Figura 22 Albero creato da stack

La colonna Stacks nell'interfaccia utente WPA contiene un espansore per ogni nodo non foglia. Nei problemi segnalati dalla valutazione, l'albero viene visualizzato insieme ai pesi aggregati. Alcuni rami possono essere rimossi dal grafico se i relativi pesi non soddisfano una soglia specificata. Lo stack di esempio seguente mostra come vengono visualizzati gli eventi rappresentati in precedenza come parte di un problema segnalato dalla valutazione.

5ms   ModuleA!Function1
5ms   ModuleA!Function2
5ms   ModuleA!Function3
      |
4ms   |-ModuleA!Function4
4ms   |   ModuleB!Function1
| &nbsp; |
1ms   |   |-ModuleB-Function2
1ms   |   |    ModuleB-Function3
| &nbsp; |
3ms   |   |-ModuleB!Function3
3ms   |        ModuleB!Function4
      |
1ms   |-ModuleA!Function5
1ms        ModuleC!Function1
1ms        ModuleC!Function2

Il <itself> nodo in uno stack rappresenta l'ora in cui una funzione stessa si trova all'inizio dello stack. Il <itself> nodo non include il tempo impiegato nelle funzioni chiamate dalla funzione padre. Tale durata viene chiamata tempo esclusivo impiegato nella funzione.

Ad esempio, Function1 chiama Function2. La funzione 2 ha impiegato 2 ms in un ciclo a elevato utilizzo di CPU e ha chiamato un'altra funzione eseguita per 4 ms. Può essere rappresentato dallo stack seguente:

6ms   ModuleA!Function1
      |
2ms   |-<itself>
4ms   |-ModuleA!Function2
4ms        ModuleB!Function3
4ms        ModuleB-Function4

Tecniche

Questa sezione descrive un approccio standard all'analisi delle prestazioni. Fornisce tecniche che è possibile usare per analizzare i problemi di prestazioni comuni correlati alla CPU.

L'analisi delle prestazioni è un processo in quattro passaggi:

  1. Definire lo scenario e il problema.

  2. Identificare i componenti coinvolti e l'intervallo di tempo pertinente.

  3. Creare un modello di ciò che dovrebbe essere successo.

  4. Usare il modello per identificare i problemi e analizzare le cause radice.

Definire lo scenario e il problema

Il primo passaggio dell'analisi delle prestazioni consiste nel definire chiaramente lo scenario e il problema. Molti problemi di prestazioni influiscono sugli scenari misurati dalle metriche di valutazione. Ad esempio:

Scenario 1: una risorsa fisica non viene usata completamente. Ad esempio, un server non può utilizzare completamente una connessione di rete perché non è in grado di crittografare i pacchetti in modo sufficientemente rapido.

Scenario 2: una risorsa fisica viene usata più di quanto dovrebbe essere. Ad esempio, un sistema usa risorse CPU significative durante un periodo di inattività che usa l'alimentazione della batteria.

Scenario 3: le attività non vengono completate a una tariffa obbligatoria. Ad esempio, i fotogrammi vengono eliminati durante la riproduzione video perché i fotogrammi non vengono decodificati abbastanza rapidamente.

Scenario 4: un'attività è stata ritardata. Ad esempio, l'utente ha avviato Internet Explorer, ma ha richiesto più tempo del previsto per aprire una scheda.

Gli scenari 3 e 4 correlati alle risorse della CPU sono illustrati in questa guida. Gli scenari 1 e 2 non rientrano nell'ambito e non sono coperti. Per analizzare questi problemi, è possibile iniziare con un'osservazione ambigua, ad esempio "è troppo lenta" e porre domande aggiuntive per identificare lo scenario e il problema esatto.

Identificare i componenti e il periodo di tempo

Dopo aver identificato lo scenario e il problema, è possibile identificare i componenti coinvolti e il periodo di tempo di interesse. I componenti includono risorse hardware, processi e thread.

È spesso possibile trovare l'intervallo di tempo di interesse identificando l'attività associata nella guida all'analisi. Un'attività è un intervallo tra un evento di avvio e un evento di arresto che è possibile selezionare e ingrandire in WPA. Se un'attività non è definita, è possibile trovare l'intervallo di tempo cercando eventi generici specifici associati allo scenario oppure cercando modifiche nell'utilizzo delle risorse che potrebbero contrassegnare l'inizio e la fine di uno scenario. Ad esempio, se la CPU è inattiva per due secondi e quindi completamente utilizzata per quattro secondi e quindi inattiva per due secondi, i quattro secondi di utilizzo completo potrebbero essere l'area di interesse in una traccia che acquisisce la riproduzione video.

Create a Model (Creare un modello)

Per comprendere le cause radice di un problema, è necessario avere un modello di ciò che dovrebbe essere successo. Il modello inizia con il problema o con qualsiasi obiettivo associato per la metrica; Ad esempio, "Questa operazione deve essere stata completata in meno di 5 secondi".

Un modello più completo contiene informazioni sulle prestazioni dei componenti. Ad esempio, quale comunicazione è prevista tra i componenti? Qual è l'utilizzo delle risorse tipico? Quanto tempo sono in genere necessarie le operazioni?

Le informazioni per il modello sono spesso disponibili nella guida all'analisi della valutazione. Se tale risorsa non è disponibile, è possibile produrre una traccia da hardware e software simili che non presentano il problema di prestazioni, per creare un modello.

Usare il modello per identificare i problemi e quindi analizzare le cause radice

Dopo aver creato un modello, è possibile confrontare una traccia con il modello per identificare i problemi. Ad esempio, un modello per una particolare attività denominata Suspend Devices potrebbe suggerire che l'intera attività deve essere completata in tre secondi, mentre ogni istanza di una sottoattività denominata Suspend <Device Name> non deve richiedere più di 100 ms. Se due istanze dell'attività secondaria Sospendi <nome> dispositivo richiedono 800 ms, è necessario analizzare tali istanze.

Ogni deviazione dal modello può essere analizzata per trovare una causa radice. È necessario esaminare lo stato dei thread coinvolti e cercare le cause radice comuni. Di seguito sono descritte alcune principali cause radice correlate alla CPU, per le attività che non vengono completate a una velocità richiesta o ritardate:

Utilizzo diretto della CPU: i thread appropriati hanno ricevuto risorse cpu complete, ma il programma richiesto non è stato eseguito abbastanza rapidamente. Ciò può essere causato da un malfunzionamento del programma o da hardware lento.

Interferenza dei thread: un thread non ha avuto tempo di esecuzione sufficiente perché altri thread erano in esecuzione. In questo caso, il thread viene considerato affamato o superato.

Interferenza DPC/ISR: i thread non hanno avuto tempo di esecuzione sufficiente perché le CPU erano occupate durante l'elaborazione di CONTROLLER di rete o ISR.

In molti casi, una di queste cause radice non influisce notevolmente sul thread e il thread impiega la maggior parte del tempo in uno stato di attesa. In questo caso, è necessario identificare e analizzare l'evento per il quale il thread è in attesa. Questo tipo ricorsivo di indagine viene definito analisi di attesa e inizia identificando il percorso critico.

Tecnica avanzata: analisi di attesa e percorso critico

Un'attività è una rete di operazioni, alcune sequenziali e alcune parallele, che passano da un evento di inizio a un evento finale. Qualsiasi coppia di eventi di inizio/fine in una traccia può essere visualizzata come attività. Il percorso più lungo attraverso questa rete di operazioni è noto come percorso critico. La riduzione della durata di qualsiasi operazione sul percorso critico riduce direttamente la durata dell'attività complessiva, anche se può anche modificare il percorso critico.

La figura 23 Operazioni attività mostra l'attività di tre thread. Thread-1 invia l'evento di avvio dell'attività e quindi attende che Thread-2 e Thread-3 completino le attività. Thread-2 completa prima l'attività, seguita da Thread-3. Quando entrambi i thread hanno completato le attività, Thread-1 viene letto e completa l'evento di attività.

Figura 23 operazioni di attività

Figura 23 Operazioni attività

In questo scenario, il percorso critico include parti di Thread-3 e Thread-1. Questi sono tracciati nella figura 24 Percorso critico. Poiché Thread-2 non si trova nel percorso critico, il tempo necessario per completare l'attività non influisce sul tempo complessivo dell'attività.

Figura 24 percorso critico

Figura 24 Percorso critico

Il percorso critico è una risposta letterale di basso livello alla domanda sul motivo per cui un'attività ha richiesto il tempo necessario. Dopo aver conosciuto i segmenti chiave del percorso critico, è possibile analizzarli per individuare i problemi che contribuiscono al ritardo complessivo.

Approccio generale alla ricerca del percorso critico

Il primo passaggio per trovare il percorso critico consiste nell'esaminare il modello di scenario per comprendere lo scopo e l'implementazione dell'attività.

La comprensione di un'attività consente di identificare operazioni, processi e thread specifici che potrebbero trovarsi nel percorso critico. Ad esempio, un ritardo nell'attività Init fast startup resume explorer può essere causato dalle applicazioni RunOnce e dal processo di inizializzazione di Explorer, che richiedono una quantità significativa di I/O.

Dopo aver esaminato il modello di scenario, verificare se la valutazione ha segnalato problemi per l'attività interessata. Molte volte, un'approssimazione del percorso critico è inclusa nei problemi di ritardo segnalati dalla valutazione. Il percorso critico viene visualizzato come sequenza di attese e azioni pronte. Può essere letto dall'inizio alla fine come sequenza di eventi, con il segmento principale ritardato del percorso critico al centro dell'elenco. L'ultima voce nell'elenco è l'azione che ha letto il thread che ha completato l'attività.

Se è necessario cercare manualmente il percorso critico, è consigliabile identificare il processo e il thread che ha completato l'attività e lavorare all'indietro dall'istante in cui l'attività è stata completata. È possibile identificare il processo e il thread che hanno avviato un'attività e il processo e il thread che hanno completato un'attività, tramite il grafico Attività in WPA.

Il grafico Attività viene visualizzato quando la traccia viene caricata tramite un file XML dei risultati della valutazione. Per identificare il processo e il thread associati a una determinata attività, espandere il grafico in Attività di interesse e quindi passare alla visualizzazione a Graph+Table. Impostare la modalità grafico su Tabella. Le colonne Start Process, Start Thread ID, End Process e End Thread ID vengono visualizzate per ogni attività nella tabella.

Dopo aver appreso il processo iniziale e finale, il thread e l'implementazione dell'attività, il percorso critico può essere tracciato all'indietro. Iniziare analizzando il thread che ha completato l'attività, per determinare il modo in cui il thread ha trascorso la maggior parte del tempo: esecuzione, pronto o in attesa.

Un tempo di esecuzione significativo indica che l'utilizzo diretto della CPU potrebbe aver contribuito alla durata del percorso critico. Il tempo impiegato in modalità pronta indica che altri thread contribuiscono alla durata del percorso critico impedendo l'esecuzione di un thread sul percorso critico. Tempo di attesa impiegato per i punti di I/O, timer o altri thread e processi nel percorso critico per il quale il thread corrente era in attesa.

Ogni thread che ha letto il thread corrente è probabilmente un altro collegamento nel percorso critico e può anche essere analizzato fino a quando non viene considerata la durata del percorso critico.

Procedura: ricerca del percorso critico in WPA

La procedura seguente presuppone che sia stata identificata un'attività nel grafico Attività per cui si vuole trovare il percorso critico.

  1. È possibile identificare il processo che ha completato l'attività passando il puntatore del mouse sull'attività nel grafico Attività .

  2. Aggiungere il grafico Utilizzo CPU (preciso). Eseguire lo zoom sull'attività interessata e applicare il set di impostazioni Utilizzo per processo, Thread .

  3. Fare clic con il pulsante destro del mouse sulle intestazioni di colonna e rendere visibili le colonne ReadyThreadStack e Utilizzo CPU (ms). Rimuovere le colonne Ready (us) [Max] e Waits (us) [Max].

  4. Espandere il processo di destinazione e ordinarlo rispettivamente in base all'utilizzo della CPU (ms), Pronto (us) [Somma]e Attese (us) [Somma].

  5. Cercare i NewThreadId nel processo con la quantità di tempo più elevata impiegato nello stato In esecuzione, Pronto o In attesa.

    I thread che impiegano tempo significativo negli stati In esecuzione o Pronto potrebbero rappresentare l'utilizzo diretto della CPU nel percorso critico. Si notino i relativi ID thread.Thread che impiegano tempo significativo nello stato In attesa potrebbero essere in attesa di I/O, un timer o su un altro thread nel percorso critico.

  6. Per individuare i thread in attesa, espandere il gruppo NewThreadId per visualizzare ReadyThreadStack.

  7. Espandere [Radice].

  8. Gli stack che iniziano con KiDispatchInterrupt non sono correlati a un altro thread. Per determinare l'attesa del thread in questi stack, espandere KiDispatchInterrupt e visualizzare le funzioni nello stack figlio. IopfCompleteRequest indica che il thread letto era in attesa di I/O. KiTimerExpiration indica che il thread letto era in attesa di un timer.

  9. Espandere gli stack che non iniziano con KiDispatchInterrupt finché non viene visualizzato ReadyingProcess e ReadyingThread. Se il processo è già espanso, espandere NewThreadId corrispondente a ReadyingThreadThread. Ripetere questo passaggio fino a trovare un thread in esecuzione, pronto, in attesa di un altro motivo o in attesa di un processo diverso. Se il thread è in attesa di un processo diverso, ripetere questa procedura usando tale processo.

Esempio

In questo esempio viene visualizzato un ritardo nell'attività Init Fast Startup Resume Explorer. Una ricerca nel riquadro Problemi mostra che per questa attività vengono segnalati sette problemi di tipo ritardo. Ognuno di questi problemi può essere esaminato come segmento del percorso critico. Vengono identificati i segmenti chiave seguenti:

  • Il thread 3872 del processo TestBootStrapper.exe (3024) viene sospeso per 2,1 secondi.

  • Il thread 3872 del processo TestBootStrapper.exe (3024) usa 1 secondo di tempo cpu.

  • Il thread 3872 del processo TestBootStrapper.exe (3024) scarica un hive del Registro di sistema per 544 millisecondi.

  • Il thread 3872 del processo TestBootStrapper.exe (3024) è in sospensione per 513 millisecondi.

  • Thread 4052 e 4036 di Explorer.exe letti dal disco, causando un ritardo di 461 millisecondi.

  • Thread 3872 di TestBootStrapper.exe di processo (3024) stelle per 187 millisecondi.

  • Il thread 3872 del processo TestBootStrapper.exe scrive 3,5 MB su disco, causando un ritardo di 178 millisecondi.

I problemi mostrano che questa attività è stata ritardata di 5,2 secondi. Questi ritardi contribuiscono in gran parte alle attività complessive di 6,3 secondi. L'applicazione TestBootStrapper.exe è principalmente responsabile del ritardo, principalmente perché ha superato altre attività di elaborazione.

Esaminare i problemi nel percorso critico

  1. Eseguire lo zoom sull'area interessata e aggiungere le colonne ReadyThreadStack e Utilizzo CPU (ms).

  2. In questo caso, Explorer.exe è il processo che completa l'attività. Espandere il processo di explorer.exe e ordinarlo rispettivamente in base all'utilizzo della CPU (ms), Pronto (us) [Somma]e Attese (us) [Somma], come illustrato nelle figure seguenti:

    figura 25 attività in base all'utilizzo della CPU ms

    Figura 25 Attività in base all'utilizzo della CPU (ms)

    figura 26 attività da parte di noi pronti

    Figura 26 Attività per ready (us)

    figura 27 attività da attenderci

    Figura 27 Attività per attese (us)

  3. L'ordinamento in base alla colonna Utilizzo CPU (ms) mostra una riga figlio superiore di 299 millisecondi. L'ordinamento in base alla colonna Ready (us) [Sum] mostra una riga figlio superiore di 46 ms. L'ordinamento in base alla colonna Waits (us) [Sum] mostra una riga figlio superiore di 5749 millisecondi e una seconda riga di 4902 millisecondi. Poiché queste righe contribuiscono in modo significativo al ritardo, è consigliabile esaminarle ulteriormente.

  4. Espandere gli stack per visualizzare i thread pronti, come illustrato nelle figure seguenti:

    readying process and readying thread

    Figura 28 Processo di preparazione e thread di preparazione per un thread

    Figura 29 processo di preparazione e thread di preparazione per

    Figura 29 Processo di preparazione e thread di preparazione per un altro thread

    In questo esempio, il primo thread impiega la maggior parte del tempo in attesa dell'uscita del processo RunOnce.exe. È consigliabile esaminare il motivo per cui il processo di RunOnce.exe richiede molto tempo per il completamento. Il secondo thread è in attesa del primo thread ed è probabilmente un collegamento insignificante nella stessa catena di attesa.

  5. Ripetere i passaggi di questa procedura per RunOnce.exe. La colonna principale che contribuisce è Waits (us) e ha quattro possibili collaboratori.

  6. Espandere ogni collaboratore per verificare che i primi tre collaboratori siano ognuno in attesa del quarto collaboratore. Questa situazione rende i primi tre collaboratori insignificanti alla catena di attesa. Il quarto collaboratore è in attesa di un altro processo, TestBootStrapper.exe.

    Questo scenario è illustrato nella figura 30 Processo di preparazione e pronto per un thread in RunOnce.exe:

    Figura 30 processo di preparazione e thread di preparazione per

    Figura 30 Processo di preparazione e thread di preparazione per un thread in RunOnce.exe

  7. Ripetere i passaggi di questa procedura per TestBootStrapper.exe. I risultati sono illustrati nelle tre figure seguenti:

    Figura 31 thread per utilizzo cpu ms

    Figura 31 Thread in base all'utilizzo della CPU (ms)

    figura 32 thread pronti

    Figura 32 Thread per pronto (us)

    figura 33 thread per aspettarci

    Figura 33 Thread per attese (us)

    Thread 3872 trascorso circa 1 secondo in esecuzione, 2 secondi pronti e 1,3 secondi in attesa. Poiché questo thread è anche il thread pronto per il thread 3872, i tempi di esecuzione e pronto probabilmente contribuiscono al ritardo. La valutazione segnala i problemi seguenti i cui tempi corrispondono ai ritardi:

    • Il thread 3872 del processo TestBootStrapper.exe (3024) viene sospeso per 2,1 secondi.

    • Thread 3872 di TestBootStrapper.exe di processo (3024) stelle per 187 millisecondi.

    • Il thread 3872 del processo TestBootStrapper.exe (3024) usa 1 secondo di tempo cpu.

  8. Per trovare altri problemi che contribuiscono, visualizzare l'evento per il quale il thread 3872 era in attesa. Espandere ReadyThreadStack per visualizzare i collaboratori ai 1,3 secondi di attesa, come illustrato nella figura 34 Collaboratori al tempo di attesa:

    figura 34 collaboratori per il tempo di attesa

    Figura 34 Collaboratori al tempo di attesa

    KiRetireDpcList è in genere correlato all'I/O e KiTimerExpiration è un timer. È possibile visualizzare la modalità di avvio di I/O e timer rimuovendo ReadyThreadStack e quindi visualizzando NewThreadStack. Questa visualizzazione mostra tre funzioni correlate, come illustrato nella figura 35 I/O e Timer in NewThreadStack:

    figura 35 ios e timer in newthreadstack

    Figura 35 I/O e timer in NewThreadStack

    Questa visualizzazione rivela i dettagli seguenti:

    • Il thread 3872 del processo TestBootStrapper.exe (3024) scarica un hive del Registro di sistema per 544 millisecondi.

    • Il thread 3872 del processo TestBootStrapper.exe (3024) è in sospensione per 513 millisecondi.

    • Il thread 3872 del processo TestBootStrapper.exe scrive 3,5 MB su disco, causando così un ritardo di 178 millisecondi.

  9. Quando è stato avviato l'analisi del percorso critico, è stata analizzata la causa di attesa più significativa in Explorer.exe e sono state ignorate le parti del percorso critico che si sono verificate dopo tale causa di attesa. Per acquisire questa sezione precedentemente ignorata del percorso critico, è necessario esaminare la sequenza temporale. Aggiungere utilizzo CPU (preciso) e applicare il set di impostazioni Sequenza temporale per processo, thread .

  10. Filtrare per includere solo i processi identificati come parte del percorso critico. Il grafico risultante è illustrato nella figura 36 Sequenza temporale del percorso critico:

    Figura 36 sequenza temporale del percorso critico

    Figura 36 Sequenza temporale del percorso critico

    La figura 36 Sequenza temporale del percorso critico mostra che Explorer.exe eseguito più lavoro dopo che è stato arrestato in attesa di RunOnce.exe. Eseguire lo zoom sul periodo di tempo dopo la catena di attesa analizzata in precedenza ed eseguire un'altra analisi. In questo caso, l'analisi rivela un numero elevato di thread interni a Explorer.exe e nessuna traccia chiara attraverso il percorso critico. In questo caso, è probabile che un'ulteriore analisi non restituisca informazioni utili.

Utilizzo diretto della CPU

Le attività vengono spesso ritardate perché un thread nel percorso critico usa un tempo di CPU significativo. Usando il modello di stato del thread, è possibile notare che questo problema è caratterizzato da un thread nel percorso critico che impiega una quantità eccezionale di tempo nello stato In esecuzione. In alcuni hardware, questo utilizzo elevato della CPU può contribuire a ritardi.

Identificazione dei problemi

Molte valutazioni usano euristica per identificare i problemi diretti relativi all'utilizzo della CPU. L'utilizzo significativo della CPU nel percorso critico viene segnalato come un problema nel formato seguente:

L'uso della CPU da parte del processo P ritarda l'attività interessata A per x secondi

Dove P è il processo in esecuzione, A è l'attività e x è il tempo in secondi.

Se questi problemi vengono segnalati per un'attività che comporta ritardi, l'utilizzo diretto della CPU potrebbe essere la causa.

Analizzare l'utilizzo diretto della CPU

  1. È possibile identificare manualmente il problema cercando singole CPU che comportano un utilizzo della CPU del 100% nel grafico Utilizzo CPU (sampled).

  2. Eseguire lo zoom su un'area di interesse nel grafico e selezionare il set di impostazioni Utilizzo per processo e thread .

    Per impostazione predefinita, la tabella visualizza le righe nella parte superiore con il massimo utilizzo aggregato della CPU. Questi thread vengono visualizzati anche nella parte superiore del grafico Utilizzo CPU (sampled).

    Nota In un sistema con più processori, un thread che usa il 100% di un singolo processore sembra consumare 100/(numero di processori logici). In questo tipo di sistema, solo il thread di inattività virtuale (PID 0, TID 0) può mostrare un utilizzo del processore superiore a 100/(numero di processori logici). Se i processi e i thread che utilizzano la maggior parte della CPU corrispondono a qualsiasi thread nel percorso critico, l'utilizzo diretto della CPU è probabilmente un fattore.

Esempio di problema relativo all'utilizzo diretto della CPU segnalata dalla valutazione

L'uso della CPU da parte del processo di TestUM.exe (4024) ritarda l'attività interessata, il processo di arresto rapido dell'avvio TestIM.exe per 2,1 secondi. Questo esempio è illustrato nella figura 37 Thread 3208:

Figura 37 thread 3208

Figura 37 Thread 3208

Analisi

Dopo aver rilevato che l'utilizzo diretto della CPU contribuisce a un ritardo nel percorso critico, è necessario identificare i moduli e le funzioni specifici che contribuiscono al ritardo.

Tecnica: esaminare un problema di utilizzo diretto della CPU segnalato dalla valutazione

È possibile espandere un problema di utilizzo diretto della CPU segnalato dalla valutazione per visualizzare il percorso critico interessato dall'utilizzo diretto della CPU. Se si espande il nodo associato all'utilizzo della CPU, verranno visualizzati gli stack associati all'utilizzo della CPU e ai moduli associati. Questa visualizzazione è illustrata nella figura 38 Segmento di utilizzo della CPU espanso:

Figura 38 segmento di utilizzo della CPU espanso

Figura 38 Segmento di utilizzo cpu espanso

Tecnica: esplorare manualmente gli stack di un problema di utilizzo diretto della CPU

Se la valutazione non ha riportato un problema o se è necessaria una verifica aggiuntiva, è possibile usare il grafico Utilizzo CPU (sampled) per raccogliere manualmente informazioni sui moduli e sulle funzioni coinvolti in un problema di utilizzo della CPU. A tale scopo, è necessario ingrandire l'area di interesse e visualizzare gli stack ordinati in base all'utilizzo della CPU.

Esplorare manualmente gli stack di un problema di utilizzo diretto della CPU

  1. Scegliere Carica simboli dal menu Traccia.

  2. Eseguire lo zoom della sequenza temporale per visualizzare solo la parte del percorso critico interessato dal problema della CPU.

  3. Applicare il set di impostazioni Utilizzo per processo e thread .

  4. Aggiungere la colonna Stack alla visualizzazione e quindi trascinare questa colonna a destra di ID thread (a sinistra della barra).

  5. Espandere il processo e il thread per visualizzare gli alberi dello stack.

    Le righe nello stack vengono ordinate in ordine decrescente in base al peso % dell'utilizzo della CPU. Questo mette gli stack più interessanti sopra. Man mano che si espandono gli stack, controllare la colonna % Weight per assicurarsi che lo stato attivo rimanga sulle righe con il massimo utilizzo.

  6. Per estrarre una copia dello stack, selezionare tutte le righe, fare clic con il pulsante destro del mouse e scegliere Copia selezione.

Risoluzione

È possibile applicare rimedi sia a livello di configurazione che di componente per risolvere un utilizzo elevato della CPU.

L'utilizzo diretto della CPU ha un impatto maggiore sui computer con processori di fascia inferiore. In questi casi, è possibile aggiungere più potenza di elaborazione al computer. In alternativa, è possibile rimuovere i moduli di problema dal percorso critico o dal sistema. Se è possibile modificare i componenti, prendere in considerazione uno sforzo di riprogettazione per ottenere uno dei risultati seguenti:

  • Rimuovere il codice a elevato utilizzo di CPU dal percorso critico

  • Usare algoritmi più efficienti per la CPU

  • Rinviare o memorizzare nella cache il lavoro

Interferenza thread

L'utilizzo della CPU da parte di thread che non si trovano nel percorso critico (e che potrebbero non essere correlati all'attività), può causare ritardi nei thread presenti nel percorso critico. Il modello di stato del thread mostra che questo problema è caratterizzato da thread nel percorso critico che impiegano una quantità insolita di tempo nello stato Pronto.

Identificazione dei problemi

Molte valutazioni usano euristica per identificare i problemi correlati alle interferenze. Questi sono riportati in una delle due forme seguenti:

  • Il processo P è affamato. La fame causa un ritardo per l'attività interessata A di x ms .

  • Il processo P viene preceduto. La precedenza causa un ritardo per l'attività interessata A di x ms .

Dove P è il processo, A è l'attività e x è l'ora in ms.

La prima maschera riflette l'interferenza dei thread allo stesso livello di priorità del thread nel percorso critico. La seconda forma riflette l'interferenza dei thread che si trovano a un livello di priorità superiore rispetto al thread nel percorso critico.

Se questi tipi di problemi vengono segnalati per un'attività ritardata, l'interferenza dei thread può essere la causa. È possibile usare il grafico Utilizzo CPU (Preciso) per identificare manualmente il problema.

Identificare i problemi di interferenza dei thread

  1. Ingrandire l'intervallo e applicare il set di impostazioni Utilizzo per CPU . Un utilizzo del 100% tra tutte le CPU indica un problema di interferenza.

  2. Applicare il set di impostazioni Utilizzo per processo, Thread e ordinare in base alla prima colonna Ready (us). Si tratta della colonna che include il Aggregazione somma .

  3. Espandere il processo dell'attività interessata e osservare il tempo pronto per i thread nel percorso critico. Questo valore è il tempo massimo che il ritardo può essere ridotto risolvendo qualsiasi problema di interferenza del thread. Un valore con una grandezza significativa rispetto al ritardo esaminato indica che esiste un problema di interferenza del thread.

La figura 39 Utilizzo CPU è vicino al 100% e figura 40 Problema di interferenza thread rappresentano questo scenario:

figura 39 utilizzo cpu è vicino al 100%

Figura 39 Utilizzo CPU è vicino al 100%

Figura 40 problema di interferenza thread

Figura 40 Problema di interferenza thread

Analisi

Dopo aver identificato il problema, è necessario determinare il motivo per cui il thread interessato ha trascorso così tanto tempo nello stato Pronto.

Tecnica: determinare il motivo per cui un thread ha impiegato tempo nello stato Pronto

È possibile usare il grafico Utilizzo CPU (Preciso) per determinare il motivo per cui un thread ha impiegato tempo nello stato Pronto. È prima necessario determinare se il thread è limitato a determinati processori. Anche se non è possibile ottenere direttamente queste informazioni, è possibile esaminare la cronologia di utilizzo della CPU di un thread durante periodi di utilizzo elevato della CPU. Questo è il periodo in cui i thread tendono a passare frequentemente tra processori.

Determinare le restrizioni del processore di un thread

  1. Eseguire lo zoom sull'area interessata.

  2. Aggiungere il grafico Utilizzo CPU (Preciso) e applicare il set di impostazioni Utilizzo per processo, Thread .

  3. Usare la finestra di dialogo Avanzate per aggiungere una colonna Cpu con una modalità di aggregazione Conteggio univoco a destra di NewThreadId.

  4. Filtrare il grafico per visualizzare solo i thread a cui si è interessati.

    Il valore nella colonna Cpu riflette il numero di processori in cui il thread è stato eseguito durante l'intervallo di tempo corrente. Durante i periodi di utilizzo della CPU del 100%, questo numero approssima il numero di processori in cui è consentito l'esecuzione di questo thread. Se il valore è minore del numero di processori disponibili, il thread è probabilmente limitato a determinate CPU.

    La figura 41 Thread con restrizioni fornisce un esempio di questo grafico:

    Figura 41 Thread con restrizioni

    Figura 41 Thread con restrizioni

Dopo aver stabilito le restrizioni del processore di un thread, è possibile determinare quale thread ha superato o risolto il thread. A tale scopo, è necessario identificare gli intervalli trascorsi dal thread nello stato Ready e quindi esaminare gli altri thread o processi in esecuzione durante tali intervalli.

Determinare il valore di Preempted o Starved the Thread

  1. Creare un grafico che mostra quando il thread era nello stato Pronto e applicare il set di impostazioni Utilizzo per processo, Thread .

  2. Aprire l'editor di visualizzazione, fare clic su Avanzate e selezionare la scheda Configurazione grafico.

  3. Impostare Ora di inizio su ReadyTime (s) e impostare Durata su Pronto (us), come illustrato nella figura 42 Colonne ora pronta. Fare clic su OK.

    Figura 42 colonne di tempo pronto

    Figura 42 Colonne ora pronta

  4. Nell'editor di visualizzazione sostituire la colonna Utilizzo CPU (%) con la colonna Ready (us) [Sum].

  5. Selezionare il thread di interesse per produrre un grafico simile alla figura 43 Ready Time Graph:

    Figura 43 grafico ora pronta

    Figura 43 Grafico ora pronta

  6. In questo caso, il thread ha impiegato tempo significativo nello stato Pronto. Per determinare la priorità tipica, aggiungere un'aggregazione Media alla colonna NewInPri .

    In questo caso, la priorità media del thread è esattamente 8. Questo numero indica che è probabilmente un thread in background che non riceve mai elevazioni di priorità.

  7. Dopo aver conosciuto la priorità media, esaminare l'attività della CPU per le CPU in cui è consentito eseguire il thread.

    In questo caso, il thread è stato determinato ad avere affinità solo per CPU 1.

  8. Aggiungere un altro grafico Utilizzo CPU (Preciso) e applicare il set di impostazioni Utilizzo cpu per CPU . Selezionare le CPU pertinenti.

  9. Aprire la visualizzazione Avanzate e aggiungere un filtro per la priorità trovata in precedenza per filtrare tale thread. Questo scenario è illustrato nella figura 44 Filtro thread:

    Figura 44 filtro thread

    Figura 44 Filtro thread

    Nella figura 45 utilizzo CPU, tempo pronto e attività di altro thread, il grafico superiore mostra l'utilizzo della CPU del thread 3548. Il grafico centrale mostra l'ora in cui il thread era pronto e il grafico inferiore mostra l'attività sulle CPU in cui è stato consentito l'esecuzione del thread (in questo caso Cpu1).

    figura 45 utilizzo cpu tempo pronto e altro thread ac

    Figura 45 Utilizzo CPU, tempo pronto e attività di altro thread

  10. Eseguire lo zoom in un'area in cui il thread era pronto, ma non è stato eseguito per la maggior parte del tempo durante tale intervallo.

  11. Nel grafico Utilizzo CPU aggiungere NewInPri a sinistra della barra ed esaminare i risultati.

    I thread o i processi con priorità uguali alla priorità del thread di destinazione indicano l'ora in cui il thread è stato risolto. I thread o i processi con priorità più alta rispetto alla priorità del thread di destinazione indicano il tempo di precedenza del thread. È possibile calcolare il tempo totale di precedenza del thread aggiungendo i tempi di tutti i thread e le azioni preemptive.

    La figura 46 Utilizzo per priorità Quando il thread di destinazione era pronto indica che sono stati superati 730 ms di tempo del thread e 300 ms di tempo del thread sono stati superati. Questa figura viene ingrandita a un intervallo di 1192 ms.

    Figura 46 utilizzo per priorità quando il thread di destinazione era

    Figura 46 Utilizzo per priorità quando il thread di destinazione era pronto

  12. Per determinare quali thread sono responsabili della precedenza e della fame di questo thread, aggiungere la colonna NewProcess a destra della colonna NewInPri ed esaminare i livelli di priorità in cui sono stati eseguiti i processi. In questo caso, la precedenza e la fame sono state causate principalmente da un altro thread nello stesso processo e da TestResidentApp.exe. È possibile presupporre che questi processi ricevano elevazioni di priorità periodiche al di sopra della priorità di base.

Risoluzione

È possibile risolvere i problemi di precedenza o di fame modificando la configurazione o i componenti. Considerare i rimedi seguenti:

  • Rimuovere i processi problematici dal sistema.

  • Regolare la priorità di base dei processi problematici...

  • Modificare l'ora in cui vengono eseguiti i processi problematici; ad esempio, ritardare l'ora di inizio in caso di riavvio del computer.

  • Se i componenti del problema possono essere modificati, riprogettarli in modo che siano meno a elevato utilizzo della CPU o per l'esecuzione con priorità inferiore.

Interferenza DPC/ISR

Quando un tempo eccessivo del processore viene utilizzato eseguendo controller di rete e ISR, potrebbe non esserci abbastanza tempo di CPU disponibile per l'esecuzione dei thread. Questa situazione può causare ritardi simili all'interferenza dei thread. Quando i thread devono completare le operazioni a una frequenza regolare ad alta frequenza, ad esempio nella riproduzione video o nell'animazione, l'interferenza da parte di DPC e ISR può causare problemi operativi.

Identificazione dei problemi

Molte valutazioni usano euristica per identificare i problemi correlati a DPC/ISR. L'attività DPC/ISR viene identificata come sospetta quando viene segnalata come un problema nel formato seguente:

DPC D supera la soglia di m millisecondi x volte durante P. Le n istanze di questo DPC vengono eseguite per un totale combinato di t millisecondi.

Dove D è DPC, m è il numero di millisecondi che imposta la soglia, x è il numero di volte in cui il DPC ha superato la soglia, P è il processo corrente, n è il numero di istanze eseguite dal DPC e t è il tempo totale in millisecondi che il DPC ha superato la soglia.

Ad esempio, il problema seguente viene segnalato da una valutazione:

DPC sdbus.sys! SdbusWorkerDpc supera l'obiettivo di 3,0 millisecondi 153 volte durante la durata del motore multimediale. Le 153 istanze di questo DPC vengono eseguite per un totale combinato di 864 millisecondi

Se questo problema viene segnalato per un'attività che presenta eventi di problema o ritardi, l'attività DPC/ISR potrebbe essere la causa.

Identificare manualmente l'interferenza DPC/ISR

  1. Per identificare manualmente l'interferenza DPC/ISR, aprire una traccia in WPA e identificare gli eventi di problema di interesse. Si tratta di eventi generici specifici della valutazione, ad esempio Microsoft-Windows-Dwm-Core:SCHEDULE_GLITCH o Microsoft-Windows-MediaEngine:DroppedFrame.

  2. Accanto al grafico degli eventi, aggiungere il grafico DPC/ISR Duration by CPU ( Durata DPC/ISR). Se i picchi nella durata DPC/ISR in base al grafico della CPU si allineano agli eventi di problema, le richieste DPC/ISR potrebbero essere un fattore che causa i problemi.

  3. Per altri dati, eseguire lo zoom avanti nel periodo di tempo che si verifica 100 ms prima della visualizzazione di diversi eventi di problema. Se un'attività DPC/ISR significativa viene visualizzata in uno o più processori nell'area di 100 ms prima che si verifichino gli eventi di problema, è possibile concludere che gli eventi di problema sono stati causati dall'attività DPC/IRS.

  4. Per determinare se l'interferenza DPC/ISR causa ritardi, eseguire lo zoom su un'area che mostra un thread in esecuzione. Prendere nota della CPU o delle CPU in cui è in esecuzione questo thread.

  5. Nel grafico DPC/ISR applicare la durata DPC/ISR in base al set di impostazioni cpu e visualizzare l'attività DPC/ISR sulle CPU pertinenti in tale intervallo di tempo.

La figura 47 Eventi di problema e attività DPC/ISR mostra che il thread 864 di iexplore.exe è rilevante per l'attività interessata. Il thread 864 è nello stato In esecuzione sulla CPU2 per il 10,65% dell'intervallo di tempo in visualizzazione. Tuttavia, il grafico DPC/ISR mostra che CPU2 era occupato durante l'esecuzione di DPC/ISR per il 10% di tale tempo.

Nota La maggior parte delle richieste DPC/ISR non ha un impatto elevato, come illustrato in questo esempio.

Figura 47 eventi di problema e attività dpc isr

Figura 47 Eventi di problema e attività DPC/ISR

Nella figura 48 DPC/ISR non correlato agli eventi di problema, le richieste DPC/ISR non sono correlate ai problemi di prestazioni:

figura 48 dpc non correlato agli eventi di problema

Figura 48 DPC/ISR non correlato agli eventi di problema

Nella figura 49 Ritardo causato dall'interferenza DPC/ISR, vengono mostrati DPC/ISR per causare problemi di prestazioni:

figura 49 ritardo causato da interferenza dpc isr

Figura 49 Ritardo causato dall'interferenza DPC/ISR

Analisi

Dopo aver determinato che i DPC/ISR sono correlati a problemi o ritardi, è necessario determinare quali DPC/ISR specifici sono coinvolti e perché si verificano frequentemente o di esecuzione per un periodo di tempo eccessivo.

Tecnica: esaminare un problema DPC/ISR segnalato dalla valutazione

Nei problemi DPC/ISR segnalati dalla valutazione, è possibile espandere il problema che visualizza i processi principali che vengono superati da DPC o ISR. Espandere lo stack per visualizzare l'attività DPC per il processo più correlato all'attività interessata, come illustrato in, espandere lo stack per comprendere cosa stava facendo il DPC. La figura 50 Stack DPC espanso mostra lo stack espanso:

figura 50 stack dpc espanso

Figura 50 Stack DPC espanso

Tecnica: trovare i DPC/ISR con durata massima ed esaminare gli stack

Se una valutazione non segnala il problema DPC/ISR, è possibile usare i grafici DPC/ISR e Utilizzo CPU (campionati) per ottenere informazioni sullo stack per i DPC più rilevanti. È consigliabile trovare un DPC/ISR di interesse, prendere nota del modulo e della funzione e quindi trovare gli esempi nel grafico Utilizzo CPU (sampled) per ottenere informazioni complete sullo stack.

Trovare i DPC/ISR con durata massima ed esaminare gli stack

  1. Ingrandire l'intervallo di interesse.

  2. Nel grafico DPC/ISR selezionare il set di impostazioni DPC/ISR Duration by Module( Durata DPC/ISR per modulo).

    Se i simboli vengono caricati, gli eventi DPC/ISR vengono ordinati in base alla durata totale e quindi suddivisi in base a Module e Function. Le prime righe nell'elenco contengono gli eventi DPC/ISR che probabilmente hanno causato i problemi di evento. Prendere nota dei nomi dei moduli e delle funzioni.

  3. Nel grafico Utilizzo CPU (campionato) selezionare il set di impostazioni Utilizzo per processo. Per impostazione predefinita, questo set di impostazioni nasconde l'attività DPC/ISR.

  4. Aprire l'editor di visualizzazione e fare clic su Avanzate.

  5. Nella scheda Filtro modificare l'impostazione Nascondi righe corrispondenti all'impostazione filtro in Mantieni righe corrispondenti al filtro. Ciò consentirà la visualizzazione delle attività DPC/ISR.

  6. Rimuovere la colonna Processo e aggiungere la colonna Stack per visualizzare i DPCs/ISR ordinati in base allo stack.

  7. Deselezionare la selezione della riga corrente.

  8. Fare clic con il pulsante destro del mouse su una cella nella colonna Stack e quindi scegliere Trova in questa colonna.

  9. Immettere un modulo e una funzione annotati nel passaggio 2 di questa procedura.

  10. Selezionare Aggiungi alla selezione corrente e fare clic su Trova tutto per selezionare tutte le istanze della funzione.

  11. Dopo aver selezionato tutte le righe, fare clic con il pulsante destro del mouse e scegliere Farfalla/Visualizza chiamato.

Questa visualizzazione mostra le attività di questa funzione specifica, ordinate in base alla durata totale. La vista è simile a quella di uno stack visualizzato nella visualizzazione dettagliata di un problema segnalato dalla valutazione. La colonna Weight approssima il tempo inclusivo impiegato da ogni funzione nello stack, espresso in millisecondi.

Questa visualizzazione è illustrata nella figura 51 chiamato di un DPC ordinato in base alla durata approssimativa:

figura 51 chiamato di un dpc ordinato per approssimativo d

Figura 51 Chiamato di un DPC ordinato in base alla durata approssimativa

Tecnica: esaminare i DPC/ISR con esecuzione prolungata

La durata totale dei DPC/ISR è importante, ma è più probabile che i singoli DPC/ISR con esecuzione prolungata causino ritardi. Nel grafico DPC/ISR, la colonna Durata inclusiva (ms), ordinata in ordine decrescente, visualizza le durate massime dei singoli DPC/ISR. I DPC/ISR predefiniti disponibili in alcuni profili di valutazione consentono di filtrare questa visualizzazione in modo da visualizzare solo i DPC/ISR con una durata inclusiva maggiore di 1 ms.

Nota Se questo set di impostazioni non è disponibile, è possibile aprire la sezione Editor di visualizzazione, Avanzate per aggiungere un filtro.

Risoluzione

L'attività DPC/ISR spesso riflette un problema hardware o software che deve essere corretto a livello di hardware o componente. A livello di configurazione, è possibile sostituire l'hardware o aggiornare il driver correlato a una versione fissa. A livello di componente, l'hardware e i driver devono seguire le procedure consigliate per i DPC/ISR da MSDN e devono usare controller di dominio thread quando possibile. I CONTROLLER di dominio thread non vengono eseguiti a livello di distribuzione nelle edizioni client di Windows. Per altre informazioni sulle procedure consigliate per dpcs/ISR, vedere Linee guida sul comportamento ISR e DPC e Introduzione ai DPC thread.

Introduzione ai controller di dominio con thread

Caricamento di simboli

Risparmio energia e ACPI - Architettura e supporto driver

PPM in Windows Vista e Windows Server 2008

Priorità di pianificazione

Pianificazione, contesto del thread e IRQL

Interni di Windows, Sesta edizione

Windows Performance Analyzer

Informazioni di riferimento tecnico su Windows Performance Toolkit