Condividi tramite


Informazioni sui contatori delle prestazioni

I contatori delle prestazioni di Windows forniscono un livello di astrazione di alto livello con un'interfaccia coerente per la raccolta di vari tipi di dati di sistema, ad esempio processore, memoria e statistiche di utilizzo del disco. Gli amministratori di sistema usano i contatori delle prestazioni per monitorare i problemi di prestazioni o comportamento. Gli sviluppatori di software usano contatori delle prestazioni per controllare l'utilizzo delle risorse dei relativi componenti.

Importante

I contatori delle prestazioni di Windows sono ottimizzati per l'individuazione e la raccolta di dati amministrativi/diagnostici. Non sono appropriati per la raccolta di dati ad alta frequenza o per la profilatura delle applicazioni perché non sono progettati per essere raccolti più di una volta al secondo. Per l'accesso con sovraccarico inferiore alle informazioni di sistema, è possibile preferire API più dirette, ad esempio Process Status Helper, GlobalMemoryStatusEx, GetSystemTimeso GetProcessTimes. Per la profilatura, è possibile raccogliere i log ETW con i dati di profilatura del sistema usando tracelog.exe con -critsec, -dpcisr, -eflago -ProfileSource opzioni oppure è possibile usare profilatura contatori hardware.

Nota

Non confondere i contatori delle prestazioni di Windows con la QueryPerformanceCounter API . I contatori delle prestazioni di Windows forniscono un'astrazione di alto livello per molti tipi di informazioni di sistema. La funzione QueryPerformanceCounter consente l'accesso ottimizzato a un timestamp ad alta precisione.

Introduzione

Concetti

Il sistema contatore delle prestazioni di Windows è organizzato in consumatori, provider, insiemi di contatori, contatori, istanze, e valori dei contatori.

Un consumer è un componente software che usa i dati sulle prestazioni. Windows include diversi strumenti predefiniti che usano i dati sulle prestazioni. Tra cui Gestione attività, Monitoraggio risorse, Monitoraggio prestazioni, typeperf.exe, logman.exee relog.exe. Gli sviluppatori possono scrivere script e applicazioni che accedono ai contatori delle prestazioni tramite api del contatore delle prestazioni .

Un provider è un componente software che genera e pubblica i dati sulle prestazioni. Un provider pubblicherà i dati per uno o più set di contatori . Ad esempio, un sistema di database può registrarsi come provider di dati delle prestazioni.

  • Un provider V1 è un componente software che pubblica i dati sulle prestazioni tramite una DLL delle prestazioni , in esecuzione nel processo del consumatore. Un provider V1 viene installato in un sistema tramite un file .ini. L'architettura del provider V1 è deprecata. I nuovi provider devono usare l'architettura del provider V2.
  • Un provider V2 è un componente software che pubblica i dati sulle prestazioni tramite le API del provider di contatori delle prestazioni . Un provider V2 viene installato in un sistema tramite un file .man (manifesto XML).

Un counterset è un raggruppamento di dati sulle prestazioni all'interno di un provider. Un insieme di contatori ha un nome e uno o più contatori . La raccolta dei dati da un insieme di contatori restituisce una serie di istanze di . In alcune API di Windows, i contatori vengono chiamati oggetti di prestazione. Ad esempio, un provider di dati sulle prestazioni per un sistema di database potrebbe fornire un insieme di contatori per le statistiche per database.

Un contatore è la definizione di un singolo dato sulle prestazioni. Un contatore ha un nome e un tipo. Ad esempio, un contatore "statistiche per database" può contenere un contatore denominato "transazioni al secondo" con tipo PERF_COUNTER_COUNTER.

Un'istanza di è un'entità per cui vengono riportati dati sulle prestazioni. Un'istanza ha un nome (stringa) e uno o più valori del contatore . Ad esempio, un contatore "statistiche per database" può contenere un'istanza per ogni database. Il nome dell'istanza sarà il nome del database e ogni istanza conterrà i valori dei contatori "transazioni al secondo", "utilizzo della memoria" e "utilizzo del disco".

Un valore del contatore è il valore di un singolo pezzetto di dato del contatore delle prestazioni. Un valore del contatore è un intero senza segno, a 32 bit o a 64 bit a seconda del tipo del contatore corrispondente. Quando si parla di un'istanza , un valore del contatore può essere talvolta chiamato contatore o valore .

Consiglio

Potrebbe essere utile correlare i termini del contatore delle prestazioni a termini di foglio di calcolo più familiari. Un contatore è simile a una tabella. Un contatore è simile a una colonna. Un'istanza di è simile a una riga. Un valore di contatore è simile a una cella della tabella.

contatori a istanza singola contengono sempre dati per una sola istanza. Questo è comune per i contatori che segnalano le statistiche globali del sistema. Windows, ad esempio, dispone di un contatore a istanza singola predefinito denominato "Memoria" che segnala l'utilizzo della memoria globale.

Insiemi di contatori a più istanze contengono dati per un numero variabile di istanze. Questo è comune per i set di contatori che riportano informazioni sulle entità all'interno del sistema. Ad esempio, Windows dispone di un contatore a istanze multipla predefinito denominato "Informazioni processore" che segnala un'istanza per ogni CPU installata.

I consumatori raccoglieranno e registreranno periodicamente i dati dal contatore di un provider. Ad esempio, il consumer potrebbe raccogliere dati una volta al secondo o una volta al minuto. I dati raccolti sono denominati campione. Un esempio è costituito da timestamp insieme ai dati per le istanze del contatore. I dati per ogni istanza includono il nome dell'istanza (stringa) e un set di valori contatori (numeri interi, un valore per ogni contatore nel contatore).

I nomi di istanza devono in genere essere univoci all'interno di un esempio, ovvero un provider non deve restituire due istanze con lo stesso nome di un singolo esempio. Alcuni provider più vecchi non seguono questa regola, pertanto i consumer devono essere in grado di tollerare nomi di istanza non univoci. I nomi delle istanze non fanno distinzione tra maiuscole e minuscole, pertanto le istanze non devono avere nomi che differiscono solamente per il tipo di carattere.

Nota

Per motivi di compatibilità con le versioni precedenti, il contatore "Process" restituisce nomi di istanza non univoci in base al nome file EXE. Ciò può causare risultati confusi, in particolare quando un processo con un nome non univoco viene avviato o arrestato, in quanto ciò comporta in genere errori di dati a causa di una corrispondenza errata dei nomi di istanza tra campioni. I consumatori del contatore "Process" devono essere in grado di tollerare questi nomi di istanza non univoci e i glitch risultanti nei dati. In Windows 11 e versioni successive è possibile usare il contatore Process V2 per evitare questo problema.

I nomi delle istanze devono essere stabili attraverso i campioni, ad esempio un provider deve usare lo stesso nome di istanza per la stessa entità ogni volta che viene raccolto l'insieme di contatori.

Ogni contatore ha un tipo. Il tipo di contatore indica se il suo valore non elaborato è un intero senza segno a 32 bit o a 64 bit. Il tipo di contatore indica anche cosa rappresenta il valore grezzo del contatore, il che determina come il valore grezzo debba essere elaborato per generare statistiche utili.

Sebbene alcuni tipi di contatori siano semplici e abbiano un valore grezzo utile, molti tipi di contatori richiedono ulteriore elaborazione per creare un valore formattatoutile. Per produrre il valore formattato, alcuni tipi di contatore richiedono valori non elaborati di due campioni, alcuni tipi di contatore richiedono timestamp e alcuni tipi di contatori richiedono valori non elaborati da più contatori. Per esempio:

  • PERF_COUNTER_LARGE_RAWCOUNT è un valore grezzo a 64 bit che non richiede alcuna elaborazione per essere utile. È appropriato per i valori in un dato momento, ad esempio "Byte di memoria in uso".
  • PERF_COUNTER_RAWCOUNT_HEX è un valore non elaborato a 32 bit che richiede solo la formattazione esadecimale semplice per essere utile. È appropriato per informazioni puntuali o di identificazione, ad esempio "Flags" o "Indirizzo di base".
  • PERF_COUNTER_BULK_COUNT è un valore non elaborato a 64 bit che indica un conteggio degli eventi e viene usato per calcolare la frequenza con cui si verificano gli eventi. Per essere utile, questo tipo di contatore richiede due campioni separati nel tempo. Il valore formattato è la frequenza degli eventi, ovvero il numero di volte in cui si è verificato l'evento al secondo nell'intervallo tra i due campioni. Dati due esempi s0 e s1, il valore formattato (frequenza eventi) viene calcolato come (s1.EventCount - s0.EventCount)/(s1.TimestampInSeconds - s0.TimestampInSeconds).

Si prevede che i provider si comportino come se fossero senza stato, ovvero la raccolta di dati da un contatore non dovrebbe influire visibilmente sullo stato del provider. Ad esempio, un provider non deve reimpostare i valori dei contatori su 0 quando viene raccolto un contatore e non deve utilizzare il timestamp di una raccolta precedente per modificare i valori nella raccolta corrente. Deve invece fornire semplici valori di contatore non elaborati con tipi accurati in modo che il consumer possa calcolare statistiche utili in base ai valori non elaborati e ai relativi timestamp.

Architettura dell'API delle Prestazioni

Le applicazioni del contatore delle prestazioni richiamano le API Windows che a loro volta richiamano i provider per ottenere i dati sulle prestazioni.

I destinatari dei contatori delle prestazioni sono:

  • applicazioni fornite da Microsoft, ad esempio Gestione attività, Monitoraggio risorse, Monitoraggio prestazioni e typeperf.exe.
  • Le superfici api di alto livello fornite da Microsoft che espongono dati del contatore delle prestazioni, ad esempio classi di prestazioni WMI.
  • Le tue applicazioni o script che utilizzano le API consumer dei contatori di prestazioni .

La maggior parte degli utenti dei contatori delle prestazioni utilizza le API di PDH.dll per raccogliere dati sulle prestazioni. PDH gestisce molti aspetti complessi della raccolta di contatori delle prestazioni, ad esempio l'analisi delle query, la corrispondenza delle istanze tra più campioni e il calcolo dei valori formattati dai dati del contatore non elaborati. L'implementazione PDH usa le API del Registro di sistema quando si usano i dati di un provider V1 e usa le API consumer V2 quando si usano dati da un provider V2.

Alcuni consumer di contatori delle prestazioni meno recenti usano le API del Registro di sistema per raccogliere dati sulle prestazioni dalla chiave speciale del Registro di sistema HKEY_PERFORMANCE_DATA. Questo non è consigliato per il nuovo codice perché l'elaborazione dei dati dal Registro di sistema è complessa e soggetta a errori. L'implementazione dell'API del Registro di sistema supporta direttamente la raccolta di dati dai provider V1. Supporta indirettamente la raccolta di dati dai provider V2 tramite un livello di conversione che usa le API consumer V2.

Alcuni consumer di contatori delle prestazioni usano le funzioni consumer PerfLib V2 per accedere direttamente ai dati dai provider V2. Questo approccio è più complesso rispetto all'utilizzo dei dati usando le API PDH, ma questo approccio può essere utile se le API PDH non possono essere usate a causa di problemi di prestazioni o dipendenze. L'implementazione di PerfLib V2 supporta direttamente la raccolta di dati dai provider V2. Non supporta la raccolta di dati dai provider V1.

Nota

Windows OneCore non include PDH.dll e non include il supporto per l'utilizzo dei dati dei contatori delle prestazioni tramite le API del Registro di sistema. I consumatori in esecuzione su OneCore devono usare le funzioni di PerfLib V2.

I provider V1 sono implementati come una DLL del provider che viene caricata nel processo del consumer. L'implementazione dell'API del Registro di sistema gestisce il caricamento della DLL del provider, la chiamata alla DLL per raccogliere i dati sulle prestazioni e scaricare la DLL in base alle esigenze. La DLL del provider è responsabile di per la raccolta di dati sulle prestazioni quando necessario, ad esempio usando le normali API di Windows, RPC, named pipes, memoria condivisa, o altri meccanismi di comunicazione interprocessuali.

I provider V2 vengono implementati come programma in modalità utente (spesso un servizio Windows) o un driver in modalità kernel. In genere il codice del provider di dati delle prestazioni è integrato direttamente in un componente esistente, ad esempio il driver o il servizio segnala le statistiche su se stesso. L'implementazione di PerfLib V2 gestisce le richieste e le risposte tramite l'estensione kernel PCW.sys, pertanto il provider in genere non deve implementare alcuna comunicazione interprocesso per fornire i dati sulle prestazioni.

Nota

Le API e gli strumenti del contatore delle prestazioni di Windows includono un supporto limitato per l'accesso ai contatori delle prestazioni da altri computer tramite Registro di sistema remoto (per i provider V1) e RPC (per i provider V2). Questo supporto è spesso difficile da usare in termini di controlli di autenticazione (gli strumenti e le API possono eseguire l'autenticazione solo come utente corrente) e in termini di configurazione di sistema (gli endpoint e i servizi necessari sono disabilitati per impostazione predefinita). In molti casi, è preferibile accedere ai contatori delle prestazioni dei sistemi remoti tramite WMI anziché tramite il supporto predefinito per l'accesso remoto.

Destinatari per sviluppatori

I contatori delle prestazioni vengono spesso utilizzati dagli amministratori per identificare i problemi di prestazioni o il comportamento anomalo dei sistemi, dagli sviluppatori per studiare l'utilizzo delle risorse dei componenti software e dai singoli utenti per comprendere il comportamento dei programmi nel proprio sistema. L'utilizzo può verificarsi tramite strumenti GUI come Gestione attività o Performance Monitor, strumenti da riga di comando come typeperf.exe o logman.exe, tramite script tramite WMI e PowerShell o tramite API C/C++ e .NET.

I provider di contatori delle prestazioni vengono in genere implementati come driver in modalità kernel o servizi in modalità utente. I provider di contatori delle prestazioni vengono in genere scritti in C o C++.

Requisiti di runtime

Per informazioni sui requisiti di runtime per un particolare elemento di programmazione, vedere la sezione Requisiti della pagina di riferimento per tale elemento.

Per la cronologia delle versioni, vedere Cosa c'è di nuovo.

Vedere anche

Uso di contatori delle prestazioni

Riferimenti ai Contatori delle Prestazioni