Zbieranie danych wydajności
Po utworzeniu zapytania i dodaniu do niego liczników wywołaj funkcję PdhCollectQueryData, aby pobrać bieżące dane pierwotne dla wszystkich liczników w zapytaniu.
Wiele liczników, takich jak liczniki szybkości, wymaga dwóch próbek danych do obliczenia sformatowanej wartości danych. PdH przechowuje dane dla bieżącej próbki i wcześniej zebranej próbki. Poniższa procedura opisuje sposób zbierania wartości liczników, które wymagają dwóch próbek do obliczenia wartości wyświetlanej.
Aby zebrać wartości liczników, które wymagają dwóch próbek do obliczenia wartości wyświetlanej
- Wywołaj pdhCollectQueryData, aby zebrać pierwszy przykład.
- Wywołaj funkcję Sleep, aby poczekać co najmniej jedną sekundę między kolekcjami.
- Wywołaj pdhCollectQueryData ponownie, aby zebrać drugi przykład.
- Wywołaj funkcję PdhGetFormattedCounterValue, aby obliczyć wartość wyświetlaną.
- Powtórz kroki od 2 do 4.
Alternatywą dla samodzielnego zaimplementowania okresu oczekiwania może być wywołanie funkcji PdhCollectQueryDataEx, która tworzy wątek chronometrażu, który czeka określoną ilość czasu, zbiera przykład, a następnie wyzwala zdarzenie zdefiniowane przez aplikację.
Jeśli chcesz wykonywać zapytania dotyczące danych wydajności z pliku dziennika, możesz również zdefiniować zakres czasu. Zakres czasu ogranicza zapytanie do tych próbek, które zostały zebrane w określonym przedziale czasowym (każda próbka zawiera znacznik czasowy dla momentu zebrania). Aby uzyskać więcej informacji na temat ustawiania i pobierania zakresów czasu, zobacz Ustawianie zakresu czasu dla zapytania.
Jeśli chcesz zebrać dane wydajności i zapisać je w pliku dziennika, wywołasz funkcję PdhUpdateLog zamiast wywoływać funkcję PdhCollectQueryData. Aby uzyskać szczegółowe informacje, zobacz Praca z plikami dziennika i zapisywanie danych wydajności w pliku dziennika.
Aby uzyskać szczegółowe informacje na temat obliczania wyświetlanej wartości próbki, zobacz Wyświetlanie danych wydajności.
Zrozumienie liczników procesorów wielordzeniowych
Niektóre liczniki wydajności zostały zaprojektowane dla systemów pojedynczego procesora i mogą nie być dokładne dla komputerów wieloprocesorowych. Na przykład proces jest ograniczony do 100 procent pojedynczego procesora; jednak jego wątki mogą używać kilku procesorów, łącznie ponad 100 procent.
Wartość licznika "\Processor(_Total)\% Processor Time" to średnie użycie wszystkich procesorów. Jeśli na przykład masz dwa procesory, jeden na 100 procent, a drugi na 0 procent, ten licznik zgłosi 50 procent. Dlatego zakres wynosi od 0 do 100.
"\Process(X)\% Czas procesora" (gdzie X jest nazwą procesu), wartość licznika jest sumą użycia procesora przez wszystkie wątki procesu X. Na przykład w komputerze z dwoma procesorami, jeśli proces ma dwa wątki, jeden zajmuje 75 procent procesora CPU, a drugi przyjmuje 80 procent innego procesora CPU, ten licznik zgłosi 155 procent. Zakres dla tego licznika wynosi od 0 do 100 * ProcessorCount.
Podczas używania zestawu liczników Process
można uzyskiwać wartości poza oczekiwanym zakresem wartości użycia procesora. Aby obliczyć procent użycia procesora CPU, PDH potrzebuje dwóch próbek (z których każda ma wartość nieprzetworzoną i sygnaturę czasową). Ponieważ PDH używa tylko nazwy wystąpienia do kojarzenia procesów, czasami może mieszać próbki z różnych procesów. Na przykład jeśli próbkowane są trzy procesy o tej samej nazwie wystąpienia, a jeden z procesów zostanie zakończony po trzecim przykładzie, inny proces zostanie przeniesiony do miejsca opuszczonego przez ten zakończony proces. W związku z tym sformatowany licznik będzie dostarczać niepoprawną wartość podczas formatowania czwartej próbki, ponieważ używa trzeciej próbki z zakończonego procesu i czwartej próbki z procesu, który zajął miejsce zakończonego procesu.
W poniższej tabeli przedstawiono, jak można to zrobić, jeśli proces zostanie zakończony podczas zbierania danych. W tabeli przedstawiono pięć próbek wartości licznika dla trzech wystąpień procesu X. Próbki są zbierane w ciągu jednej sekundy. Po zebraniu trzeciego przykładu proces X w miejscu 1 zostanie zakończony. Po zakończeniu procesu X w miejscu 1 proces X w miejscu 2 przechodzi do miejsca 1. Po zebraniu czwartego przykładu dla procesu X w miejscu 2 pierwsza wartość wynosi teraz 20 zamiast 1000, a druga wartość to 1500. Podczas formatowania wartości licznika uzyskasz 1480 milisekund zamiast oczekiwanych 500 milisekund. Podczas formatowania piątej przykładowej wartości należy uzyskać oczekiwaną wartość.
Próbka | Gniazdo 0 dla procesu X | Gniazdo 1 dla procesu X | Gniazdo 2 dla procesu X |
---|---|---|---|
Przykład 1 | 0 | 0 | 0 |
Przykład 2 | 20 | 10 | 500 |
Przykład 3 | 40 | 20 | 1,000 |
Przykład 4 | 60 | 1500 (z poprzedniego slotu 2) | Nie dotyczy. Teraz zebrane w slocie 1. |
Przykład 5 | 80 | 2 000 | Nie dotyczy. Teraz zostało zebrane w gnieździe 1. |
Napiwek
Począwszy od systemu Windows 11, można uniknąć tego problemu, używając nowego Process V2
kontrasetu. Licznik Process V2
zawiera identyfikator procesu w nazwie instancji. Dzięki temu można uniknąć niespójnych wyników pojawiających się przy użyciu oryginalnego zestawu Process
.