Profilowanie programów i odpluskwianie pamięci
- Profilowanie dynamiczna analiza programu, która dokonuje pomiaru złożoności czasowej lub/i pamięciowej w czasie jego działania
List of performance analysis tools
- Debbuger pamięci narzędzie do poszukiwania wycieków pamięci i innych błędów związanych z niedozwolonym dostępęm do dynamicznie przydzielanych obszarów pamięci (np. buffer overflow)
Lista debbugerów pamięci
Profilowanie
- Pomaga zlokalizować funkcje lub fragmenty kodu na które należy zwrócić uwagę przy optymalizacji szybkości działania programu
- Czy warto optymalizować?
- Funkcje wołane tysiące razy
- Funkcje najbardziej kosztowne obliczeniowo
- Operacje wpływające na responsywność GUI
- Aplikacje uruchamiane na urządzeniach o mocno ograniczonych zasobach
- Profilowanie pomaga też często wykrywać błędy i lokalizować wady konstrukcji programu (np. niespodziewane wywołania funkcji lub brak wywołań)
Techniki profilowania
- instrumentacja, wstrzykiwanie do kodu instrukcji monitorujących (np. logi, liczniki wywołań, itp.)
- profilowanie oparte na zdarzeniach
- metody statystyczne, próbkowanie rejestru Program counter
- symulacja, uruchamianie programu w symulowanym środowisku wirtualnym, instruction set simulator (ISS)
Instrumentacja
- Instrumentacja polega na dodawaniu instrukcji służacych do uzyskania informacji o wydajności aplikacji
- liczniki instrukcji, wywołań funkcji i innych zdarzeń (performance counters)
- zastępowanie funkcji alokujących pamięć
- opakowanie wywołań funkcji odpowiednimi mechanizmami zliczającymi i mieżącymi czas wywołań
- Instrumentacja pozwala na:
- precyzyjne śledzenie wykonywanych instrukcji
- pomiar czasu wywołań w czasie działania programu
- debbugowanie i wyłapywanie sytuacji wyjątkowych
- logging
- Możliwe problemy:
- duży wpływ na wydajność programu profilowanego
- plik wykonywalny jest o wiele większy
- pomiar może zaburzać wynik,
np. Heisenbug - błąd znikająy w czasie debbugowania
Rodzaje instrumentacji
- Ręczna, dokonywana przez programistę (logi, assercje)
- Automatyczna modyfikacja kodu (Parasoft, Insure++)
- Instrumentacja kodu pośredniego, dodawana do assembly lub po dessaemblacji
- Z wykorzystaniem kompilatorów, symbole debuggera umieszczene w kodzie maszynowym
- Binarna, instrumentacja dodawana do kodu maszynowego (ATOM)
- W czasie działania:
- w momencie uruchamiania, program działa pod nadzorem narzędzia profilującego (Valgrind)
- kod modyfikowany w czasie wykonywania (DynInst)
Event-based profile
- Profilowanie oparte na przechwytywanych zdarzeniach, np. tworzenie obiektów, wywołanie metod, odpalenie wątków
- Zakładanie haków (hooks), przechwytywanie komunikatów
- .NET dołącza agenta profilującego jako serwer COM do CLR (Profiling API)
- Środowisko uruchomieniowe dostarcza informacji do agenta o wywołaniach metod, utworzeniu obiektów, itd.
- Agent profilujący potrafi podmienić bytecode profilowanego programu w odpowiedni sposób
Metody statystyczne
- Próbkowanie rejestru procesora wskazującego pozycję programu (Program counter) za pomocą przerwań systemu operacyjnego z pewną częstością
- Metoda w małym stopniu lub wcale nie ingeruje w kod i wykonanie programu
- Mniej dokładny pomiar ale pozwala na śledzenie działania programu profilowanego niemal z pełną szybkością.
- Wyniki są przybliżeniem statystycznym i obarczone są błędem pomiarowym
- Rozdzielczość pomiaru (ziarnistość danych): zależy od częstości próbkowania. Szybko wykonujące się funkcje będą niezauważalne
Sposoby raportowania
- Profil: ogólne statystyki zaobserwowanych zdarzeń, np. zliczenie wywołań poszczególnych instrukcji. Raport zazwyczaj zawiera zestawienie kodu z liczbą wywołań.
- Ślad (trace), ciąg zaobserwowanych zdarzeń, uwzględnia zależności czasowe także dla programów równoległych. Rozmiar raportu sprawia, że często niepraktyczny w zastosowaniach.
- Ciągły monitoring na maszynie wirtualnej. Pozwala uruchamiać śledzenie ścieżek w dowolnym momencie, śledzenie na żywo zmian w wydajności, mechanizmy usypiania procesów asynchronicznych w celu dokładniejszego obejrzenia równoległych procesów
Narzędzia do profilowania VS
- Diagnostic Tools - profilowanie w czasie debbugowania, od VS 2015
- CPU usage, Memory Usage, zdarzenia IntelliTrace
- Profilowanie bez debbugera (wersji Release)
- Performance wizard: Sampling, Instrumentation, Concurrency, .NET memory, Tier interaction
- Narzędzia dostępne od VS2015: CPU usage, GPU usage, Memory uage, Application Lifetime, Network usage, Energy consumption, Java Sript memory, HTML UI responsivenessi
- MSDN: VS 2015 Profiling Tools
Diagnostic Tools
- użycie CPU i pamięci
- zdarzenia InteliTrae oraz debbugera
- analiza zawartości sterty w wybranym momencie
- porównywanie zawartości sterty pomiędzy zrzutami (snapshots)
- profilowanie wywołań funkcji
- filtrowanie wyników względem wątków
Podgląd stanu sterty
Po zatrzymaniu debbugowania można wykonać migawkę (snapshot) i obejrzeć zawartość sterty
PerfTips
PerfTips - informacje o czasie wykonań fragmentów kodu umieszczonymi pomiędzy punktami przerwań debbugera
Proflowanie bez debbugera
- Odpluskwianie ma duży wpływ na wydajność aplikacji i zaburza wyniki, dlatego istotne jest użycie narzędzi profilujących dla wersji Release
- Debug → Start Diagnostic Tools Without Debbuging
- Performance Wizard: narzędzia znane z VS2013
- Aplication Timeline - profilowanie wątków interfejsu użytkonika dla WPF, UWA
- Network Usage - użycie sieci dla UWA
- CPU, GPU, Memory usage
- JavaScript Memory (UWA)
- HTML UI responsiveness - wydajność UI dla aplikacji webowych (UWA)
Od VS2015 profilowanie dostępne w menu Debug
Debug → Start Diagnostic Tools Without Debbuging
VS 2013 Profiling Tools
Performance wizard:
- Sampling zbiera dane statystyczne dotyczące wykonywanej aplikacji próbkując obciążenie CPU i stan stosu (można uwzględnić CPU/Windows counters)
- Instrumentation - pomiary wywołania poszczególnych funkcji
- Concurrency aplikacje wielowątkowe
- .NET memory użycie pamięci i garbage collection
- Tier interaction zawołania ADO.NET do baz danych SQL Serwera
Wymagania
- Uprawnienia administracyjne - wymagane przez metody próbkowania (sampling) oraz mające dostęp do wywołań systemowych
- Skompilowanie aplikacji do wersji Release
- Debug symbols files (.pdb) - m.in. definicja nazw funkcji systemowych
- Visual Studio 2012/2013/2015 Professional/Premium/Ultimate/Enterprise
- Brak wsparcia dla Windows 8/10, Windows Server 2012, WPF, UWP, wymagają innych technik profilowania
Performance Session
Perforamnce Explorer:
konfiguracja sesji,
uruchamianie testów,
porównywanie raportów
- Performance Session - konfiguracja analizy + raporty
- Targets - cel analizy: projekt, proces, plik wykonywalny
- Reports - informacje zebrane podczas analizy
- Attach/Detach - podłączenie profilowania do działającego procesu
Raport
- Hot Path najaktywniejsza ścieżka drzewa wywołań funkcji
- Lista funkcji wykonujących najwięcej pracy
Inclusive
- łącznie dla całej funkcji,Exclusive
- po odjęciu funkcji wołanych z wnętrza analizowanej funkcji
Sampling
- W stałych odstępach czasu pobiera z CPU stan stosu
- Próbkowanie: domyślnie co 10M cykli (0.01 s dla 1GHz), inne możliwe zdarzenia do próbkowania:
błędy stronicowania, wywołania systemowe, performance counters (CPU counters) - Licznik
inclusive
zwiększany dla wszystkich funkcji znajdujących się w czasie pomiaru na stosie - Licznik
exclusive
zwiększany tylko dla funkcji aktualnie wykonywanej (ze szczytu stosu) Inclusive samples
- całkowita liczba próbek zebranych dla danej funnkcjiExclusive samples
- liczba próbek pobranych w czasie gdy funkcja była wykonywana
Instrumentation
- Pomiar czasu wykonania funkcji, linii kodu i poszczególnych instrukcji
- Wstrzykiwany kod na początku i końcu badanych funkcji, mierzony jest czas pomiędzy kolejnymi zdarzeniami
- Sprawdzane jest czy pomiędzy zdarzeniami system dokonywał innych operacji (np. odczyt z dysku, komunikacja miedzy wątkami, …)
- Dla każdego zarejestrowanego interwału odtwarzany jest stos wywołań w celu określenia funkcji potomnych
Elapsed Inclusive
- czas wykonania danej funkcjiElapsed Exclisive
- czas z pominięciem czasu funkcji potomnychApplication Inlcusive
- czas wywołań w czasie których nie nastąpiło wywołanie systemoweApplication Exclusive
- jak wyżej, z pominięciem czasów funkcji potomnych
Error List
- Okno
Error List
zawiera ostrzeżenia i wskazówki dotyczące efektywności aplikacji - Performance Rules: błędy, ostrzeżenia, informacje
CPU and Windows Counters
- VS Profiler pozwala zbierać informacje o zdarzeniach systemu (windows counters, events) i procesora (CPU counters)
- Windows counters - zdarzenia dostarczane przez infrastrukturę diagnostyczną systemu, w zależności od konfiguracji nie muszą występować. Dostarczają informacji o wydajności OS, aplikacji, usług i sterowników
- CPU counters - zdarzenia związane ze sprzętem zliczane przez CPU
- Portable Performance counter
- Platform Events - specyficzne dla danej architektury, nie przenośne
Memory Allocation and Object Lifetime
- Zbiera informacje o rozmiarze i liczbie alokowanych obiektów i obiektów niszczonych w garbage collector
- Zachowuje stan stosu dla każdego takiego zdarzenia
Inclusive Sample Count
- liczba zdarzeń alokacji obiektu gdy funkcja znajdowała się na stosieExclusive Sample Count
- liczba zdarzeń alokacji obiektu gdy funkcja była wywoływana (była na szczycie stosu)Object Lifetime view
- ilość i rozmiar zaalokowanych obiektów oraz informacja o generacji GC w której zostały zniszczone
Raport
- Całkowita zajętość pamięci
- Funkcje, które zaalokowały najwięcej pamięci
- Lista typów obiektów zajmujących najwięcej miejsca
- Lista typów posiadających najwięcej instancji
Application Timeline
- profilowanie aplikacji WPF i UWA
- UI thread utilization, Visual throughput (frame rate)
Narzędzia od jetBrains
- dotMemory Smart and reliable .NET memory profiler
Podsumowanie
- Profilowanie pozwala wskazać fragmenty kodu, które należy rozpatrzyć pod względem optymalizacji
- Dynamiczna analiza: sprawdzane tylko te elementy, które zostały wykoane
- Profilowanie jest kosztowne czasowo i pamięciowo
- Profilowanie jest obarczone błędami, każda technika ma swoje ograniczenia
Więcej informacji
- Find Application Bottlenecks with Visual Studio Profiler by Hari Pulapaka and Boris Vidolov