Używanie funkcji rejestru do korzystania z danych licznika
Użyj funkcji rejestru , aby zebrać dane wydajności z specjalnego klucza rejestru HKEY_PERFORMANCE_DATA
.
Dane wydajności nie są rzeczywiście przechowywane w rejestrze. Wywołanie funkcji rejestru powoduje, że system zbiera dane od odpowiedniego dostawcy danych wydajności.
Notatka
Zwykle nie należy używać funkcji rejestru do korzystania z danych licznika. Zamiast tego należy użyć funkcji Pomocnika danych wydajności (PDH). Funkcje PDH są łatwiejsze do użycia i unikają wielu problemów z wydajnością i niezawodnością, które mogą wystąpić poprzez nieprawidłowe użycie funkcji rejestru.
Notatka
Nie można używać funkcji rejestru, jeśli piszesz aplikacje z systemem Windows OneCore. Zamiast tego użyj funkcji PerfLib v2 Consumer.
Funkcje rejestru to interfejs API niskiego poziomu do zbierania danych od dostawców V1. Funkcje rejestru obsługują również zbieranie danych od dostawców V2 za pośrednictwem warstwy tłumaczenia, która wywołuje funkcje V2 Consumer.
Aby uzyskać dane wydajności z systemu lokalnego, wywołaj funkcję RegQueryValueEx. Użyj HKEY_PERFORMANCE_DATA
jako klucza. Pierwsze wywołanie uzyskuje dostęp do klucza. Nie trzeba najpierw otwierać klucza w sposób jawny.
Aby uzyskać dane wydajności z systemu zdalnego, wywołaj funkcję RegConnectRegistry. Użyj nazwy komputera systemu zdalnego i użyj HKEY_PERFORMANCE_DATA
jako klucza. To wywołanie pobiera klucz reprezentujący dane wydajności systemu zdalnego. Użyj tego klucza, a nie HKEY_PERFORMANCE_DATA
klucza, aby pobrać dane.
Pamiętaj, aby użyć funkcji RegCloseKey do zamknięcia uchwytu klucza po zakończeniu uzyskiwania danych wydajności. Jest to ważne zarówno w przypadku przypadków lokalnych, jak i zdalnych:
-
RegCloseKey(HKEY_PERFORMANCE_DATA)
nie zamyka faktycznie dojścia rejestru, ale usuwa wszystkie buforowane dane i zwalnia załadowane biblioteki DLL wydajności. -
RegCloseKey(hkeyRemotePerformanceData)
zamyka dojście do rejestru maszyny zdalnej.
Ważny
Nie należy wywoływać RegCloseKey(HKEY_PERFORMANCE_DATA)
podczas DLL_PROCESS_DETACH
.
Aby wskazać informacje do pobrania, należy użyć parametru lpValueName
funkcji RegQueryValueEx. W poniższej tabeli wymieniono wartości, które można określić dla lpValueName
. Pamiętaj, że ciągi wartości nie są wrażliwe na wielkość liter.
Wartość | Opis |
---|---|
Global |
Pobiera dane wydajności dla wszystkich obiektów wydajności zarejestrowanych na komputerze z wyjątkiem tych uwzględnionych w kategorii Costly . |
OLD_Global |
windows Vista i nowszych: pobiera dane wydajności dla wszystkich obiektów wydajności V1 zarejestrowanych na komputerze z wyjątkiem obiektów uwzględnionych w kategorii Costly . Użyj tej funkcji zamiast Global , aby uniknąć zbierania niepotrzebnych danych dostawcy W2, gdy wiesz, że interesujące dane pochodzą od dostawcy wersji 1. |
n1 n2 ... |
Pobiera dane wydajności dla co najmniej jednego obiektu wydajności. Określ indeks dziesiętny skojarzony z każdym obiektem, który chcesz pobrać na liście rozdzielanej spacjami. Jeśli na przykład chcesz pobrać obiekty System i Pamięć i ustalisz, że indeksy odpowiadających im ciągów nazw to 2 i 4, określ ciąg "2 4" . Należy pamiętać, że zapytanie może zwrócić inną liczbę obiektów niż zażądano. Może się tak zdarzyć, jeśli określony obiekt jest niedostępny, jeśli określony obiekt zależy od innego typu obiektu lub jeśli dostawca w przeciwnym razie zwraca dane, które nie były bezpośrednio żądane. Na przykład wątki zależą od procesów, więc jeśli zażądasz danych z obiektu Thread , wyniki będą zawierać dane z obiektu Process . |
Counter n |
Pobiera ciągi nazw dla określonego identyfikatora języka, np. angielski dla Counter 9 . Użyj zwracanych ciągów nazw, aby znaleźć indeks odpowiadający podanej nazwie lub znaleźć nazwę odpowiadającą podanemu indeksowi. Aby uzyskać szczegółowe informacje, zobacz Pobieranie nazw liczników i tekstów pomocy. Zwróć uwagę, że zwracana lista zawiera nazwy obiektów (liczników) i nazwy liczników — nie ma prostego sposobu określenia, czy nazwa jest nazwą obiektu, czy nazwą licznika. |
Help n |
Pobiera ciągi pomocy dla określonego identyfikatora języka, np. angielski dla Help 9 . Użyj zwróconych ciągów pomocy, aby znaleźć opisy odpowiadające indeksom pomocy obiektu (licznika) lub licznika. Aby uzyskać szczegółowe informacje, zobacz Pobieranie nazw liczników i tekstu pomocy. |
Costly |
przestarzałe: pobiera dane wydajności dla typów obiektów, których dane są kosztowne do zbierania pod względem czasu procesora lub użycia pamięci. Ta kolekcja może potrwać kilka minut na mocno załadowanej maszynie. Należy przeprowadzić zbieranie danych w wątku roboczym, jeśli aplikacja musi odpowiadać użytkownikowi podczas tego procesu. |
MetadataGlobal |
system Windows 10 20H1 lub nowszy: pobiera metadane dla wszystkich obiektów wydajności zarejestrowanych na komputerze z wyjątkiem tych uwzględnionych w kategorii Costly . |
OLD_MetadataGlobal |
systemu Windows 10 20H1 i nowszych: pobiera metadane dla wszystkich obiektów wydajności V1 zarejestrowanych na komputerze z wyjątkiem obiektów uwzględnionych w kategorii Costly . |
MetadataCostly |
Windows 10 20H1 i późniejszych: pobiera metadane pod kątem kosztownych obiektów wydajności. |
OLD_MetadataCostly |
Windows 10 20H1 i nowsze: pobiera metadane dla kosztownych obiektów wydajności V1. |
Aby uzyskać szczegółowe informacje na temat formatu danych wydajności zwracanych przez rejestr, zobacz Format danych wydajności.
Aby zapoznać się z przykładem pobierania nazw i opisów zarejestrowanych liczników na komputerze, zobacz Pobieranie nazw liczników i tekst pomocy.
Aby uzyskać przykład opisujący dostęp do elementów danych dotyczących wydajności, zobacz Wyświetlanie nazw obiektów, wystąpień i liczników.
Aby zapoznać się z przykładem pobierania, obliczania i drukowania wartości liczników, zobacz Pobieranie danych licznika i obliczanie wartości liczników.
Zbieranie metadanych
System Windows 10 20H1 dodaje obsługę operacji zbierania tylko metadanych. Te operacje są przeznaczone do użycia podczas tworzenia listy obiektów wydajności i liczników, które są dostępne na maszynie.
- Kolekcja tylko metadanych może być szybsza niż odpowiednia kolekcja pełnych danych, ponieważ może pominąć zbieranie danych wystąpienia z obiektów obsługujących zbieranie tylko metadanych.
- Kolekcja tylko metadanych używa mniejszej ilości pamięci niż odpowiednia kolekcja pełnych danych, ponieważ nie potrzebuje miejsca na zwracanie danych wystąpienia z obiektów obsługujących zbieranie tylko metadanych.
- Kolekcja tylko metadanych jest bardziej kompletna niż odpowiednia kolekcja pełnych danych, ponieważ zwraca listę dostępnych liczników, nawet jeśli nie ma wystąpień obiektów, które obsługują zbieranie tylko metadanych.
Napiwek
Odpowiednie użycie kolekcji metadanych jest szczególnie ważne w przypadku zbierania danych z serwerów obsługujących wiele procesów lub wątków. Zwykła kolekcja Global
musi zbierać i zwracać informacje dotyczące każdego procesu i wątku w systemie, podczas gdy kolekcja MetadataGlobal
nie musi zbierać informacji o procesie ani wątku.
Funkcje pomocnika danych wydajności (PDH) automatycznie używają kolekcji tylko metadanych podczas określania zestawu obiektów wydajności dostępnych na komputerze.
Wsparcie systemu operacyjnego dla operacji dotyczących wyłącznie metadanych jest wskazywane przez wartość inną niż zero w rejestrze HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\Supports Metadata
. Jeśli ta wartość nie istnieje lub jest ustawiona na 0
, użyj kolekcji pełnej danych (np. Global
) zamiast kolekcji tylko metadanych (np. MetadataGlobal
).
Nie wszystkie obiekty wydajności obsługują zbieranie tylko metadanych. Gdy zażądasz kolekcji MetadataGlobal
, system Windows sprawdzi każdy obiekt wydajności pod kątem obsługi wyłącznie metadanych (co jest wskazywane przez wartość niezerową w wartości rejestru HKLM\SYSTEM\CurrentControlSet\Services\<ServiceName>\Performance\Collect Supports Metadata
). Jeśli obiekt wydajności nie obsługuje kolekcji tylko metadanych, system Windows wykona normalne zbieranie danych z obiektu. Jeśli obiekt wydajności obsługuje zbieranie tylko metadanych, system Windows wykona kolekcję tylko metadanych z obiektu. Dane zwrócone do Ciebie w wyniku zapytania dotyczącego tylko metadanych będą zawierać bloki PERF_OBJECT_TYPE
zarówno z pełnodanych, jak i tylko metadanych. Bloki PERF_OBJECT_TYPE
mogą zawierać lub pomijać informacje o wystąpieniu, w zależności od tego, czy blok został zebrany od dostawcy, który obsługuje lub nie obsługuje zapytań wyłącznie do metadanych.
Dane zwrócone z kolekcji tylko metadanych są takie same jak dane z normalnej kolekcji z wyjątkiem:
- Pole
NumInstances
strukturyPERF_OBJECT_TYPE
będziePERF_METADATA_MULTIPLE_INSTANCES
(wskazujące, że obiekt obsługuje 0 lub więcej nazwanych wystąpień) lubPERF_METADATA_NO_INSTANCES
(co oznacza, że obiekt zawsze ma 1 nienazwanych wystąpień). - Po
PERF_OBJECT_TYPE
struktury nie będzie żadnych blokówPERF_INSTANCE_DEFINITION
.
Perflib
Klucz rejestru HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib
obsługuje kilka wartości DWORD
związanych ze zbieraniem liczników wydajności.
Zazwyczaj nie należy ich konfigurować w przypadku zachowania domyślnego, ale administrator może skonfigurować je zgodnie z potrzebami w określonych scenariuszach.
-
Configuration Flags
: wartość domyślna to 0. Można ustawić kombinację następujących flag, aby włączyć specjalne zachowanie:-
0x01
: nie testuj wtyczek pod kątem błędów wyrównania buforu danych. Domyślnie system weryfikuje wyrównanie buforu wtyczek. -
0x02
: nie wyłączaj automatycznie wtyczek. Domyślnie system wyłącza wtyczki, które uległy awarii lub wykazują nieprawidłowe zachowanie. -
0x04
: nie weryfikuj integralności buforu wtyczki. Domyślnie system sprawdza przekroczenia buforu wtyczki. -
0x08
: Nie sprawdzaj, czy upłynął limit czasu dla wtyczki. Domyślnie system sprawdza, czy wtyczka się zawiesza.
-
-
Disable Performance Counters
: wartość domyślna to 0. Jeśli zostanie ustawione na 1, liczniki wydajności V1 zostaną wyłączone dla systemu. -
ExtCounterTestLevel
: wartość domyślna to 4. Określa, ile walidacji wykonuje system, aby chronić przed nieprawidłowym zachowaniem wtyczki. Aby uzyskać szczegółowe informacje, zobaczPM_COLLECT_PROC
.