Spis treści:

Kategoria:PowerShell


Pobieranie obciążenia procesora w PowerShell

Najczęściej używane skrypty PowerShell w pracy programisty - ikona konsoli

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

, 2017-04-14

Brak komentarzy - bądź pierwszy

Dodaj komentarz
Wyślij
Ostatnie komentarze
Świetny artyk€ł !
Ooo chyba użyli varchar-a ;)
Morzna by bylo trohe jasiniej?
To samo pytanie co wyżej. Mam za zadanie dodać kolumnę do istniejącej tabeli łącząc obie inne kolumny ze sobą, ale nie mam pojęcia jak za to się zabrać
działa :) tylko była literówka :)
Podziękował. Trochę późno, po 8 latach, ale dzięki za testy (rozumiem że dla SQL2012 robione). Tak się właśnie zastanawiałem ile złego czynię stosując czasem __(max).