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
Dzieki za rozjasnienie zagadnienia upsert. wlasnie sie ucze programowania :).
Co się stanie gdy spróbuję wyszukać:
SELECT * FROM NV_Airport WHERE Code='SVO'
SELECT * FROM V_Airport WHERE Code=N'SVO'
(odwrotnie są te N-ki)
Będzie konwersja czy nie znajdzie żadnego rekordu?