Profilowanie programów i odpluskwianie pamięci

  • 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

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

IntelliTrace

IntelliTrace rejestruje zdarzenia zachodzące w czasie wykonywania aplikacji

Linia czasu zdarzeń

Zdarzenia IntelliTrace

Konfiguracja zdarzeń InteliTrace
Tools → Options → IntelliTrace

Podgląd stanu sterty

Po zatrzymaniu debbugowania można wykonać migawkę (snapshot) i obejrzeć zawartość sterty

Porównywanie zawartości sterty

Profilowanie użycia CPU

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 funnkcji
  • Exclusive 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 funkcji
  • Elapsed Exclisive - czas z pominięciem czasu funkcji potomnych
  • Application Inlcusive - czas wywołań w czasie których nie nastąpiło wywołanie systemowe
  • Application Exclusive - jak wyżej, z pominięciem czasów funkcji potomnych

Szczegóły analizy funkcji

Error List

  • Okno Error List zawiera ostrzeżenia i wskazówki dotyczące efektywności aplikacji
  • Performance Rules: błędy, ostrzeżenia, informacje

Filtrowanie wyników


Źródło: http://msdn.microsoft.com

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 stosie
  • Exclusive 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

Porównywanie raportów

Application Timeline

  • profilowanie aplikacji WPF i UWA
  • UI thread utilization, Visual throughput (frame rate)

Timeline details

  • XAML: Layout, Parsing, Render
  • System: Disk, Network
  • Other: Garbage Collection

Narzędzia od jetBrains

dotMemory dotTrace

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