Dela via


Om prestandaräknare

Windows Prestandaräknare tillhandahåller ett abstraktionslager på hög nivå med ett konsekvent gränssnitt för insamling av olika typer av systemdata, till exempel processor, minne och diskanvändningsstatistik. Systemadministratörer använder prestandaräknare för att övervaka prestanda- eller beteendeproblem. Programvaruutvecklare använder prestandaräknare för att inspektera resursanvändningen för sina komponenter.

Viktig

Windows prestandaräknare är optimerade för identifiering och insamling av administrativa/diagnostiska data. De är inte lämpliga för datainsamling med hög frekvens eller för programprofilering eftersom de inte är utformade för att samlas in mer än en gång per sekund. För att få tillgång till systeminformation med lägre overhead, kanske du föredrar mer direkt använda API:er som ProcessStatusHelper, GlobalMemoryStatusEx, GetSystemTimeseller GetProcessTimes. För profilering kan du samla in ETW-loggar med systemprofileringsdata med hjälp av tracelog.exe med -critsec, -dpcisr, -eflageller -ProfileSource alternativ, eller så kan du använda Maskinvaruräknare profilering.

Notera

Blanda inte ihop Windows prestationsräknare med API:et QueryPerformanceCounter. Windows Prestandaräknare ger en abstraktion på hög nivå för många typer av systeminformation. Funktionen QueryPerformanceCounter ger optimerad åtkomst till en tidsstämpel med hög precision.

Komma igång

Begrepp

Windows Performance Counter-systemet är uppdelat i konsumenter, leverantörer, räknaruppsättningar, räknare, instanseroch räknarvärden.

En konsument är en programvarukomponent som använder prestandadata. Windows innehåller flera inbyggda verktyg som använder prestandadata. Dessa inkluderar Aktivitetshanteraren, Resursövervakaren, Prestandaövervakaren, typeperf.exe, logman.exeoch relog.exe. Utvecklare kan skriva skript och program som får åtkomst till prestandaräknare via API:er för prestandaräknare.

En provider är en programvarukomponent som genererar och publicerar prestandadata. En provider publicerar data för en eller flera räknare. Ett databassystem kan till exempel registrera sig som en prestandadataprovider.

  • En V1-provider är en programvarukomponent som publicerar prestandadata via en DLL- som körs i konsumentens process. En V1-provider installeras på ett system via en .ini-fil. V1-providerarkitekturen är inaktuell. Nya leverantörer bör använda V2-providerarkitekturen.
  • En V2-provider är en programvarukomponent som publicerar prestandadata via api:erna för prestandaräknare. En V2-provider installeras på ett system via en .man -fil (XML-manifest).

En räknarsats är en gruppering av prestandadata inom en leverantör. En räknarmängd har ett namn och en eller flera räknare. Om du samlar in data från en räknare returneras ett antal instanser. I vissa Windows-API:er kallas räknaruppsättningar prestandaobjekt. Till exempel kan en prestandadataprovider för ett databassystem tillhandahålla en räknare för statistik per databas.

En räknare är definitionen av ett enstaka prestandamått. En räknare har ett namn och en typ. Till exempel kan en "statistik per databas"-räknaruppsättning innehålla en räknare med namnet "transaktioner per sekund" med typen PERF_COUNTER_COUNTER.

En instans är en entitet som prestandadata rapporteras om. En instans har ett namn (sträng) och ett eller flera räknarvärden. Till exempel kan en "statistik per databas"-räknaruppsättning innehålla en instans per databas. Instansnamnet skulle vara databasnamnet och varje instans skulle innehålla räknarvärden för "transaktioner per sekund", "minnesanvändning" och "diskanvändning"-räknare.

Ett räknarvärde är värdet för en enda del av prestandaräknarens data. Ett räknarvärde är ett osignerat heltal, antingen 32-bitars eller 64-bitars beroende på typen av motsvarande räknare. När du talar om en instanskan ett -räknarvärde ibland kallas för en räknare eller ett värde.

Tips

Det kan vara bra att relatera prestandaräknartermer till mer välbekanta kalkylbladsvillkor. En moträkningssats är som en tabell. En räknare är som en kolumn. En instans är som en rad. Ett räknarvärde är som en cell i tabellen.

enskilda räknaruppsättningar innehåller alltid data för exakt en instans. Detta är vanligt för räknaruppsättningar som rapporterar systemövergripande statistik. Windows har till exempel en inbyggd räknare med en instans med namnet "Minne" som rapporterar om global minnesanvändning.

räknaruppsättningar med flera instanser innehåller data för ett variabelt antal instanser. Detta är vanligt för uppsättningar av räknare som rapporterar om entiteter i systemet. Windows har till exempel en inbyggd räknare med flera instanser med namnet "Processorinformation" som rapporterar en instans för varje installerad PROCESSOR.

Konsumenter samlar regelbundet in och registrerar data från en providers räknare. Till exempel kan konsumenten samla in data en gång per sekund eller en gång per minut. De insamlade data kallas för ett exempel. Ett prov består av tidsstämplar tillsammans med data för instanser av räknarsetet. Data för varje instans innehåller instansnamnet (strängen) och en uppsättning räknarvärden (heltal, ett värde för varje räknare i räknaruppsättningen).

Instansnamn bör normalt vara unika i ett exempel, dvs. en provider bör inte returnera två instanser med samma namn som en del av ett enda exempel. Vissa äldre leverantörer följer inte den här regeln, så konsumenter måste kunna tolerera icke-unika instansnamn. Instansnamn är inte skiftlägeskänsliga, så instanser bör inte ha namn som bara skiljer sig åt i skiftläge.

Obs.

Av bakåtkompatibilitetsskäl returnerar "Process"-räknaruppsättningen icke-unika instansnamn baserat på EXE-filnamnet. Detta kan orsaka förvirrande resultat, särskilt när en process med ett icke-unikt namn startar eller stängs av, eftersom detta vanligtvis resulterar i datafel på grund av felaktig matchning av instansnamn mellan exempel. Konsumenter av "Process"-räknaruppsättningen måste kunna tolerera dessa icke-unika instansnamn och de resulterande dataproblemen. I Windows 11 och senare kan du använda Process V2-räknaruppsättningen för att undvika det här problemet.

Instansnamnen måste vara stabila mellan exemplen, dvs. en provider ska använda samma instansnamn för samma entitet varje gång räknaruppsättningen samlas in.

Varje räknare har en typ. Räknartypen anger typen av räknarens råvärde (antingen osignerat 32-bitars heltal eller osignerat 64-bitars heltal). Räknartypen anger också vad räknarens råvärde representerar, vilket avgör hur råvärdet ska bearbetas för att generera användbar statistik.

Även om vissa räknartyper är enkla och har ett raw-värde som är direkt användbart, kräver många räknartyper ytterligare bearbetning för att skapa ett användbart formaterat värde. För att skapa det formaterade värdet kräver vissa räknartyper råvärden från två exempel, vissa räknartyper kräver tidsstämplar och vissa räknartyper kräver råvärden från flera räknare. Till exempel:

  • PERF_COUNTER_LARGE_RAWCOUNT är ett 64-bitars raw-värde som inte kräver någon bearbetning för att vara användbar. Det är lämpligt för punkt-i-tid-värden, till exempel "Byte av minne som används".
  • PERF_COUNTER_RAWCOUNT_HEX är ett 32-bitars raw-värde som bara kräver enkel hexadecimal formatering för att vara användbar. Det är lämpligt för ögonblicksbilder eller identifierande information som "flaggor" eller "basadress".
  • PERF_COUNTER_BULK_COUNT är ett 64-bitars raw-värde som anger antalet händelser och används för att beräkna den hastighet med vilken händelserna inträffar. För att vara användbar kräver den här räknartypen två exempel som är avgränsade i tid. Det formaterade värdet är händelsefrekvensen, dvs. antalet gånger händelsen inträffade per sekund under intervallet mellan de två exemplen. Med två exempel s0 och s1beräknas det formaterade värdet (händelsefrekvens) som (s1.EventCount - s0.EventCount)/(s1.TimestampInSeconds - s0.TimestampInSeconds).

Leverantörer förväntas bete sig som om de vore tillståndslösa, dvs. insamling av data från en motuppsättning bör inte märkbart påverka leverantörens tillstånd. En tjänsteleverantör bör till exempel inte återställa räknarvärden till 0 när en räknaruppsättning samlas in, och den bör inte använda tidsstämpeln för en tidigare insamling för att justera värdena i den aktuella insamlingen. I stället bör den tillhandahålla enkla råa räknarvärden med exakta typer så att konsumenten kan beräkna användbar statistik baserat på råvärdena och deras tidsstämplar.

Prestanda-API-arkitektur

prestandaräknarprogram anropar Windows-API:er som anropar leverantörer för att hämta prestandadata.

Användare av prestandaräknare inkluderar:

De flesta prestandaräknare använder API:er från PDH.dll för att samla in prestandadata. PDH hanterar många komplexa aspekter av insamling av prestandaräknare, till exempel parsning av frågor, matchning av instanser mellan flera exempel och databehandling av formaterade värden från rådata. PDH-implementeringen använder register-API:erna när du använder data från en V1-provider och använder V2-konsument-API:erna när du använder data från en V2-provider.

Vissa äldre program för prestandamätning använder register-API:er för att samla in prestandadata från den speciella registernyckeln HKEY_PERFORMANCE_DATA. Detta rekommenderas inte för ny kod eftersom bearbetningen av data från registret är komplex och felbenägen. Implementeringen av register-API:et har direkt stöd för insamling av data från V1-leverantörer. Den stöder indirekt insamling av data från V2-leverantörer via ett översättningslager som använder V2-konsument-API:er.

Vissa prestandaräknare använder funktionerna PerfLib V2 Consumer för direkt åtkomst till data från V2-leverantörer. Detta är mer komplext än att använda data med hjälp av PDH-API:er, men den här metoden kan vara användbar om PDH-API:er inte kan användas på grund av prestanda- eller beroendeproblem. PerfLib V2-implementeringen stöder direkt insamling av data från V2-leverantörer. Det stöder inte insamling av data från V1-leverantörer.

Anteckning

Windows OneCore innehåller inte PDH.dll och har inte stöd för att hämta prestandaräknardata via registrets API:er. Användare som kör OneCore måste använda PerfLib V2 Consumer-funktionerna.

V1-leverantörer implementeras som en leverantörs-DLL som läses in i konsumentprocessen. Implementeringen av register-API:et hanterar inläsning av providerns DLL, anropar till DLL:n för att samla in prestandadata och tar bort DLL:n efter behov. Provider-DLL ansvarar för insamling av prestandadata efter behov, t.ex. genom att använda vanliga Windows-API:er, RPC, namngivna pipes, delat minne eller andra kommunikationsmekanismer mellan processer.

V2-leverantörer implementeras som antingen ett användarlägesprogram (ofta en Windows-tjänst) eller en drivrutin i kernelläge. Vanligtvis integreras koden för prestandadataprovidern direkt i en befintlig komponent (dvs. drivrutinen eller tjänsten rapporterar statistik om sig själv). PerfLib V2-implementeringen hanterar begäranden och svar via PCW.sys kerneltillägget, så providern behöver vanligtvis inte implementera någon interprocesskommunikation för att tillhandahålla prestandadata.

Anteckning

API:er och verktyg för Prestandaräknare i Windows innehåller begränsat stöd för åtkomst till prestandaräknare från andra datorer via Fjärrregister (för V1-leverantörer) och RPC (för V2-leverantörer). Det här stödet är ofta svårt att använda när det gäller autentiseringskontroller (verktygen och API:erna kan bara autentiseras som den aktuella användaren) samt när det gäller systemkonfiguration (de nödvändiga slutpunkterna och tjänsterna är inaktiverade som standard). I många fall är det bättre att komma åt prestandaräknarna för fjärrsystem via WMI- i stället för via den inbyggda fjärråtkomstsupporten.

Målgrupp för utvecklare

Prestandaräknare används ofta av administratörer för att identifiera prestandaproblem eller onormalt beteende hos system, av utvecklare för att studera resursanvändning av programvarukomponenter och av enskilda användare för att förstå hur program beter sig på deras system. Användning kan ske via GUI-verktyg som Aktivitetshanteraren eller Prestandaövervakaren, kommandoradsverktyg som typeperf.exe eller logman.exe, via skript via WMI och PowerShell eller via C/C++ och .NET-API:er.

Prestandaräknarleverantörer implementeras vanligtvis som kernellägesdrivrutiner eller användarlägestjänster. Prestandaräknarleverantörer skrivs vanligtvis i C eller C++.

Körningskrav

Information om körningskrav för ett visst programmeringselement finns i avsnittet Krav på referenssidan för det elementet.

Versionshistorik finns i Vad som är nytt.

Se även

Använda prestandaräknare

referens för prestandaräknare