Monitorowanie wydajności aplikacji–Performance Counters

Optymalizacja jest zajęciem pełnym wyzwań. Aby wiedzieć jednak, co należy zoptymalizować, trzeba aplikacje odpowiednio monitorować. Bardzo często wystarczy zwykła klasa Stopwatch, do sprawdzenia, które fragmenty aplikacji są zbyt wolne. Wydajność to jednak nie wyłącznie czas wykonania poszczególnej funkcji. Przyczyny mogą być różne takie jak zbyt dużo wypromowanych obiektów do GEN2, przełączanie kontekstów, cache misses czy zbyt wysoka liczba wątków. Performance Counters są wbudowanym w Windows, zestawem różnych liczników, monitorujących stan aplikacji. Za pomocą ich możemy sprawdzać, czy dana aplikacja zachowuje się w sposób normalny i oczekiwany.

Wystarczy uruchomić perfmon.exe, a pojawi się aplikacja do monitorowania liczników:

image

Mamy do dyspozycji różne liczniki, monitorujące chyba każdą możliwą metrykę. Wystarczy kliknąć z menu kontekstowego, Add Counters i wybrać odpowiednią kategorię oraz licznik. Na przykład, sprawdźmy ile jest kolekcji kolejno w GEN0, GEN1, GEN2 (proszę zwrócić uwagę na konkretne instancje liczników):

image

Na wykresie pojawi się nam ile kolekcji jest dokonywanych:

image

Jeśli za dużo będzie GEN2 w porównaniu do GEN0, to znaczy, że jest gdzieś problem w alokacji pamięci.

Liczników jest naprawdę wiele i mamy do dyspozycji oddzielne kategorie dla ASP.NET i WCF. Możemy monitorować ile zapytań przychodzi, jaki jest czas ich wykonania itp.  W łatwy sposób możemy określić przepustowość, zużycie zasobów w zależności od zapytań czy ewentualne timeout’y.  Jeśli podejrzewamy, że aplikacja ma wyciek pamięci to w łatwością możemy sprawdzić czy ma to miejsce w pamięci zarządzanej czy natywnej (są odpowiednie liczniki na to). Analogicznie sprawa wygląda z SQL Server, który eksponuje liczniki przechowujące liczbę transakcji itp. W taki sposób, możliwe jest określenie ile zapytań musi być kolejkowanych i nie jest możliwe ich szybkie przetworzenie.

Ponadto, wartości liczników można zapisywać do plików co stanowić będzie po prostu plik logu. Wystarczy przejść do Data Collector Sets->User Defined->New Data Collector Set:

image

Następnie w kreatorze wprowadzamy nazwę, dane, które chcemy zapisywać oraz lokalizacje pliku docelowego:

image

Oczywiście potem, możemy taki plik przeglądać w tej samej aplikacji, wraz z wykresem itp.

Inna ciekawostką są alerty. Możliwe jest zdefiniowanie progów po których powinno być wykonane jakieś zadanie – przydatne dla administratorów.

W następnym wpisie pokażę jak wygląda API w c# oraz jak tworzyć własne liczniki, specyficzne dla konkretnej aplikacji – np. pozwoli to monitorować konkretne zapytanie czy akcje w systemie. Należy mieć na uwadze, że liczników nie można aktualizować wiele razy w ciągu sekundy ponieważ nie mają one tak wysokiej precyzji. Służą one wyłącznie do przechowywania średnich wartości np. liczba zapytań w ciągu sekundy. Jeśli zależy nam na dużo wyższej dokładności to należy skorzystać z innych mechanizmów ale o tym już wkrótce.

Leave a Reply

Your email address will not be published.