Pobieranie obciążenia procesora w PowerShell
Liczniki wydajności Windows
System Windows posiada liczne mechanizmy pozwalające na monitorowanie zachowań samego systemu, aplikacji i usług. Najbardziej znanym narządziem jest chyba Menedżer zadań. Pozwala on pobrać obciążenie procesora, pamięć zajętą przez poszczególne procesy czy obciążenie karty sieciowej. Jest to z pewnoscią doskonałe narzędzie dla użytkowników, którzy chcą szybko zobaczyć stan systemu. Istnieją jednak inne narzędzia, które znacznie łatwiej automatyzować. Są to liczniki wydajności. Liczniki wykorzystywane są, tak jak Menedżer zadań, w celu udostępnienia informacji o systemie, aplikacjach, usługach i wskazują, jak te komponenty sobie radzą. Pozwala to wskazać słabe elementy, a na dalszym etapie ulepszyć ich działanie. Dane te mogą być pobierane i przetwarzane przez praktycznie każdą aplikację. Nie inaczej jest z PowerShellem.Pobieranie informacji o zajętości procesora
Aby pobrać dane licznika związane z obciążeniem procesora, a w zasadzie wszystkich procesorów, wystarczy wywołać polecenie Get-Counter z odpowiednią nazwą, np.:
Get-Counter "\Procesor(*)\Czas procesora (%)"
Tu mała uwaga: jeżeli system operacyjny jest w innym języku, nazwy będą inne. Jeżeli wszystko się uda, otrzymamy rezultat podobny do poniższego (przykład obejmuje maszyną z czterema procesorami):
Timestamp CounterSamples --------- -------------- 2017-04-14 18:57:52 \\komputer\procesor(0)\czas procesora (%) : 10,5217729945603 \\komputer\procesor(1)\czas procesora (%) : 13,6072290981962 \\komputer\procesor(2)\czas procesora (%) : 5,89358883910656 \\komputer\procesor(3)\czas procesora (%) : 19,7781413054679 \\komputer\procesor(_total)\czas procesora (%) : 12,450190476247
Przyznam, że nie jest to najwygodniejszy sposób prezentacji informacji. Nie jest też łatwy w późniejszym przetwarzaniu i analizowaniu - zwłaszcza, gdy mamy wiele takich pomiarów. Znacznie wygodniejsza, przynajmniej dla mnie jest forma tabelaryczna, gdzie każdy z procesorów ma swoją kolumnę. Popatrzmy na nieco bardziej złożony skrypt:
Get-Counter "\Procesor(*)\Czas procesora (%)" -MaxSamples 5 | % { $obj = [PSCustomObject]@{Time = $_.Timestamp} $_.CounterSamples | % { $obj | Add-Member -MemberType NoteProperty -Name "Processor($($_.InstanceName))" -Value $_.CookedValue } $obj } | ft
Tym razem wyniki będą się prezentowały następująco:
Time Processor(0) Processor(1) Processor(2) Processor(3) Processor(_total) ---- ------------ ------------ ------------ ------------ ----------------- 2017-04-14 19:07:23 15,1414729941447 8,96994375735522 10,5128260665526 4,34129682976312 9,74138985705781 2017-04-14 19:07:24 9,2392634503808 12,315898587656 12,315898587656 6,16262831310558 10,0084173042262 2017-04-14 19:07:25 12,315898587656 7,70094588174318 6,16262831310558 7,70094588174318 8,47010959653541 2017-04-14 19:07:26 16,9308512935689 7,70094588174318 12,315898587656 15,3925337249313 13,0850524415014 2017-04-14 19:07:27 21,5458039994817 9,2392634503808 15,3925337249313 20,0074864308441 16,5462743666462
Analiza takiej tabelki wydaje się łatwiejsza.
Domyślnie próbki zbierane są co jedną sekundę, ale można to zmienić korzystając z parametru -SampleInterval.
Jakie liczniki są dostępne?
Liczników jest tak dużo, że w praktyce bardzo trudno odnaleźć właściwy. Najwygodniej chyba szukać ich po nazwach, które intuicyjnie sami byśmy im nadali. Dla liczników procesora szukalibyśmy czegoś z procesor w nazwie, na przykład:
(Get-Counter -ListSet *procesor*).Paths
Na moim systemie powyższa instrukcja wyświetli następującą listę:
\Informacje o procesorze(*)\Flagi stanu procesora \Informacje o procesorze(*)\% maksymalnej częstotliwości \Informacje o procesorze(*)\Częstotliwość procesora \Informacje o procesorze(*)\Stan wstrzymania \Informacje o procesorze(*)\Czas priorytetowy (%) \Informacje o procesorze(*)\Przejścia C3/s \Informacje o procesorze(*)\Przejścia C2/s \Informacje o procesorze(*)\Przejścia C1/s \Informacje o procesorze(*)\Czas C3 (%) \Informacje o procesorze(*)\Czas C2 (%) \Informacje o procesorze(*)\Czas C1 (%) \Informacje o procesorze(*)\Czas bezczynności (%) \Informacje o procesorze(*)\Szybkość DPC \Informacje o procesorze(*)\Kolejkowane DPC/s \Informacje o procesorze(*)\Czas przerwań (%) \Informacje o procesorze(*)\Czas DPC (%) \Informacje o procesorze(*)\Przerwania/s \Informacje o procesorze(*)\Czas uprzywilejowany (%) \Informacje o procesorze(*)\Czas użytkownika (%) \Informacje o procesorze(*)\Czas procesora (%) \Cykle aktywności sieciowej na procesor(*)\Cykle zakończenia wysyłania stosu/s \Cykle aktywności sieciowej na procesor(*)\Cykle zmian tabeli wyłuskania RSS miniportu \Cykle aktywności sieciowej na procesor(*)\Cykle budowania listy scatter-gather/s \Cykle aktywności sieciowej na procesor(*)\Cykle zakończenia wysyłania specyfikacji NDIS/s \Cykle aktywności sieciowej na procesor(*)\Cykle wysyłania miniportu/s \Cykle aktywności sieciowej na procesor(*)\Cykle wysyłania specyfikacji NDIS/s \Cykle aktywności sieciowej na procesor(*)\Cykle zwracania pakietów miniportu/s \Cykle aktywności sieciowej na procesor(*)\Cykle zwracania pakietów specyfikacji NDIS/s \Cykle aktywności sieciowej na procesor(*)\Cykle wskazywania odbioru stosu/s \Cykle aktywności sieciowej na procesor(*)\Cykle wskazywania odbioru specyfikacji NDIS/s \Cykle aktywności sieciowej na procesor(*)\Cykle przerwań/s \Cykle aktywności sieciowej na procesor(*)\Cykle przerwań DPC/s \Aktywność karty sieciowej na procesor(*)\Bajty odciążeń wysyłania danych TCP/s \Aktywność karty sieciowej na procesor(*)\Bajty odciążeń odbioru danych TCP/s \Aktywność karty sieciowej na procesor(*)\Wywołania żądania odciążenia wysyłania danych TCP/s \Aktywność karty sieciowej na procesor(*)\Wskazywania odciążeń odbioru danych TCP/s \Aktywność karty sieciowej na procesor(*)\Odebrane pakiety niskiego stanu zasobów/s \Aktywność karty sieciowej na procesor(*)\Wskazywania niskiego stanu zasobów odbioru/s \Aktywność karty sieciowej na procesor(*)\Wywołania zmiany tabeli wyłuskania RSS/s \Aktywność karty sieciowej na procesor(*)\Wywołania budowania listy scatter-gather/s \Aktywność karty sieciowej na procesor(*)\Pakiety zakończenia wysyłania/s \Aktywność karty sieciowej na procesor(*)\Wysłane pakiety/s \Aktywność karty sieciowej na procesor(*)\Wywołania zakończenia wysłania/s \Aktywność karty sieciowej na procesor(*)\Wywołania żądania wysłania/s \Aktywność karty sieciowej na procesor(*)\Zwrócone pakiety/s \Aktywność karty sieciowej na procesor(*)\Odebrane pakiety/s \Aktywność karty sieciowej na procesor(*)\Wywołania zwrócenia pakietu/s \Aktywność karty sieciowej na procesor(*)\Wskazywania odbioru/s \Aktywność karty sieciowej na procesor(*)\Przerwania/s \Aktywność karty sieciowej na procesor(*)\Kolejkowane DPC/s \Procesor(*)\Czas procesora (%) \Procesor(*)\Czas użytkownika (%) \Procesor(*)\Czas uprzywilejowany (%) \Procesor(*)\Przerwania/s \Procesor(*)\Czas DPC (%) \Procesor(*)\Czas przerwań (%) \Procesor(*)\Kolejkowane DPC/s \Procesor(*)\Szybkość DPC \Procesor(*)\Czas bezczynności (%) \Procesor(*)\% czasu C1 \Procesor(*)\% czasu C2 \Procesor(*)\% czasu C3 \Procesor(*)\Przejścia/s C1 \Procesor(*)\Przejścia/s C2 \Procesor(*)\Przejścia/s C3 \Wydajność procesora(*)\Częstotliwość procesora \Wydajność procesora(*)\% maksymalnej częstotliwości \Wydajność procesora(*)\Flagi stanu procesora
Nie wszystkie ścieżki bezpośrednio odnoszą się do procesora w popularnym tego słowa znaczeniu - część dotyczy karty sieciowej, wiemy też, że np. karty graficzne mają swój procesor. Lista pozwala jednak przejrzeć potencjalne możliwości i przekonać się o skali liczników. Warto wiedzieć, że każda z tych ścieżek może mieć wewnętrze, bardziej szczegółowe liczniki - tak jak licznik procesora, który ma oddzielne wewnętrzne liczniki dla każdego z rdzeni.
Kategoria:PowerShell
Brak komentarzy - bądź pierwszy