Centrum skryptów - Systemy operacyjne

Jak kontrolować dane zwracane przez Monitor wydajności?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak kontrolować dane zwracane przez Monitor wydajności?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Bardzo lubię korzystać z Monitora wydajności firmy Microsoft (PerfMon) do sprawdzania różnych informacji w systemie Windows Server, ale chciałbym mieć większą kontrolę nad zwracanymi danymi. Nigdy nie jestem pewien, czego się właściwie dowiaduję ani w jaki sposób są przeprowadzane obliczenia. Czy to możliwe?

-- SK

Cześć Skrypciarze! Pytanie

Cześć, SK! Istnieje wiele klas WMI monitorowania wydajności. Wszystkie są oparte na licznikach wydajności widocznych po otworzeniu narzędzia PerfMon. To, jakie dokładnie klasy wydajności masz zainstalowane na komputerze, zależy od zainstalowanego oprogramowania i używanej wersji systemu operacyjnego. Aby utworzyć listę klas monitorowania wydajności na komputerze, można użyć następującego wiersza kodu programu Windows PowerShell:

Get-WmiObject -List | Where-Object { $_.name -match 'perf' }

Powstaje w ten sposób imponująca lista klas WMI. Widać ją poniżej niniejszego akapitu. Jeśli się dobrze przyjrzeć, można zauważyć, że niektóre nazwy klas WMI zawierają słowo „PerfRawData”. Natomiast inne klasy mają w nazwie słowo „PerfFormattedData”.

Istnieją dwa rodzaje klas wydajności WMI: klasy liczników pierwotnych i liczników imitowanych. Na czym polegają różnice między nimi? Liczniki pierwotne to po prostu surowe dane. Nie są one w żaden sposób przetwarzane ani opracowywane. Liczniki imitowane, dostępne w systemie Windows XP i nowszych, są udostępniane przez dostawcę sformatowanych danych wydajności (j.ang.), który podaje wyliczone dane liczników. Często liczniki imitowane w wartościach uwzględniają czas i zgłaszają takie dane, jak wykorzystanie dysku; taka wartość jest pozbawiona znaczenia, jeśli nie uwzględnia czasu.

Preferuję więc liczniki imitowane. Można zmodyfikować kwerendę programu Windows PowerShell w taki sposób, aby uzyskać tylko wartości imitowanych liczników:

Get-WmiObject -List | Where-Object { $_.name -match 'perf' -AND $_.name -notmatch 'raw'}

Liczniki imitowane widzimy tutaj:

Klasy monitora wydajności WMI mogą zostać bezpośrednio powiązane z licznikami dostępnymi w narzędziu PerfMon. Jak widać poniżej, dla obiektu Processor dostępnych jest kilka liczników wydajności. Jedną z kwestii, o których warto pamiętać, jest to, że nazwa klasy WMI będzie z reguły w jakiś sposób powiązana z kategorią, którą widać z lewej strony na poniższej grafice. Właściwości odpowiadają licznikom widocznym z prawej strony grafiki. Wystąpienie klasy WMI odpowiada pozycji „Wystąpienia wybranego obiektu”, widocznej w lewym dolnym rogu grafiki.

Dostępne są setki klas liczników wydajności WMI, jak więc znaleźć tę, która jest potrzebna? Jednym ze sposobów jest użycie zmodyfikowanej kwerendy WMI, takiej jak ta, której wcześniej użyliśmy do utworzenia listy klas wydajności. W celu znalezienia klas powiązanych z procesorem możemy użyć np. takiej kwerendy:

Get-WmiObject -List | 

Where-Object { $_.name -match 'perf' -AND $_.name -notmatch 'raw' -AND $_.name -match 'processor'}

Jest to jeden logiczny wiersz kodu. Zawinąłem wiersz na znaku potoku, aby zwiększyć czytelność. Kiedy program Windows PowerShell trafi na znak potoku na końcu wiersza, rozpozna, że jest to niepełne polecenie i będzie automatycznie kontynuował w kolejnym wierszu.

Można zauważyć, że dodaliśmy tylko kolejny operator -AND z instrukcją, że nazwa musi odpowiadać ciągowi znaków „processor” Po uruchomieniu tego kodu otrzymamy wyłącznie klasę wydajności WMI będącą imitowanym licznikiem powiązanym z procesorami:

Win32_PerfFormattedData_PerfOS_Processor

Możemy użyć klasy WMI bezpośrednio, przekazując ją do właściwości -class apletu polecenia Get-WmiObject. Widać to poniżej:

Get-WmiObject -Class Win32_PerfFormattedData_PerfOS_Processor

To szybkie i łatwe. Ta kwerenda zawsze zwróci co najmniej dwa wystąpienia: jedno wystąpienie procesora i jedno o nazwie _Total. Na komputerze z jednym jednordzeniowym procesorem wystąpienie _Total jest dokładnie takie samo, jak wystąpienie procesora 0. Jeśli w komputerze jest wiele rdzeni i wiele procesorów, zwróconych zostanie o jedno więcej wystąpień, niż jest rdzeni i procesorów. Można wybrać określone wystąpienie do monitorowania (co jest szczególnie korzystne, jeśli mamy ustawioną koligację procesorów (j.ang.) dla danego procesu lub aplikacji); monitorować każde wystąpienie z osobna; lub monitorować łączne wykorzystanie procesora, czyli wystąpienie _Total. Jeśli zależy nam na dokładnej diagnostyce, lepiej jest monitorować każde wystąpienie obiektu procesora z osobna. Jednak często wystarczy monitorowanie wystąpienia _Total.

Łatwym sposobem uzyskania danych dotyczących konkretnego wystąpienia obiektu procesora jest przesłanie potokiem wyników kwerendy WMI do apletu polecenia Where-Object, tak jak to widać poniżej:

Get-WmiObject -Class Win32_PerfFormattedData_PerfOS_Processor | where-object { $_.name -eq '_Total'}

Uruchomienie tego wiersza kodu powinno przynieść wynik taki jak poniżej:

__GENUS               : 2

__CLASS               : Win32_PerfFormattedData_PerfOS_Processor

__SUPERCLASS          : Win32_PerfFormattedData

__DYNASTY             : CIM_StatisticalInformation

__RELPATH             : Win32_PerfFormattedData_PerfOS_Processor.Name="_Total"

__PROPERTY_COUNT      : 24

__DERIVATION          : {Win32_PerfFormattedData, Win32_Perf, CIM_StatisticalInformation}

__SERVER              : OFFICE

__NAMESPACE           : root\cimv2

__PATH                : \\OFFICE\root\cimv2:Win32_PerfFormattedData_PerfOS_Processor.Name="_Total"

C1TransitionsPersec   : 0

C2TransitionsPersec   : 0

C3TransitionsPersec   : 0

Caption               :

Description           :

DPCRate               : 1

DPCsQueuedPersec      : 209

Frequency_Object      :

Frequency_PerfTime    :

Frequency_Sys100NS    :

InterruptsPersec      : 1279

Name                  : _Total

PercentC1Time         : 0

PercentC2Time         : 0

PercentC3Time         : 0

PercentDPCTime        : 0

PercentIdleTime       : 0

PercentInterruptTime  : 0

PercentPrivilegedTime : 4

PercentProcessorTime  : 4

PercentUserTime       : 0

Timestamp_Object      :

Timestamp_PerfTime    :

Timestamp_Sys100NS    :

Ogromną zaletą programu Windows PowerShell jest to, że właściwości obiektu są automatycznie wyświetlane bez potrzeby używania instrukcji write-host (podobnej do instrukcji wscript.echo w języku VBScript) dla każdej właściwości, która ma zostać wyświetlona. Można zauważyć, że część właściwości na nazwy zaczynające się na „__”. Są to właściwości systemowe klasy WMI. Bywają ciekawe, ale przeważnie nie ma potrzeby ich wyświetlać. Łatwym sposobem odfiltrowania tych informacji jest użycie operatora zakresu, takiego jak poniżej:

Get-WmiObject -Class Win32_PerfFormattedData_PerfOS_Processor | 

where-object { $_.name -eq '_Total'} | 

Format-List -Property [a-z]*

Powinniśmy teraz uzyskać bardziej czytelne dane:

C1TransitionsPersec   : 0

C2TransitionsPersec   : 0

C3TransitionsPersec   : 0

Caption               :

Description           :

DPCRate               : 2

DPCsQueuedPersec      : 253

Frequency_Object      :

Frequency_PerfTime    :

Frequency_Sys100NS    :

InterruptsPersec      : 1317

Name                  : _Total

PercentC1Time         : 0

PercentC2Time         : 0

PercentC3Time         : 0

PercentDPCTime        : 0

PercentIdleTime       : 0

PercentInterruptTime  : 1

PercentPrivilegedTime : 6

PercentProcessorTime  : 6

PercentUserTime       : 0

Timestamp_Object      :

Timestamp_PerfTime    :

Timestamp_Sys100NS    :

Powyższa lista jest poprawna, ale przypuszczam, że ciągle zawiera sporo niepotrzebnych informacji. Być może interesują Cię jedynie wartości Percent, ale już nie wartości PercentC1Time i PercentDPCTime. Załóżmy też, że chcesz uzyskać wartość InterruptsPerSecond, ale bez wartości powiązanych. Nie trzeba podawać wszystkich nazw właściwości do apletu polecenia Format-List. Zamiast tego można zastosować sztuczkę z operatorem i użyć symbolu wieloznacznego „*”. Spójrzmy na poniższe polecenie:

Get-WmiObject -Class Win32_PerfFormattedData_PerfOS_Processor | 

where-object { $_.name -eq '_Total'} | 

Format-List -Property percent[i-z]*, int*

Oto jego dane wyjściowe:

PercentIdleTime       : 0

PercentInterruptTime  : 1

PercentPrivilegedTime : 4

PercentProcessorTime  : 4

PercentUserTime       : 0

InterruptsPersec      : 1281

Doskonale! To właśnie te informacje, które chcieliśmy uzyskać. Jutro zagłębimy się nieco bardziej w tajniki korzystania z klas wydajności WMI. Do zobaczenia!

Skrypciarze Ed Wilson i Craig Liebendorfer

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne