→ Slide 1

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
→ Slide 2
  • 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ń)
→ Slide 3
  • 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)
→ Slide 4
  • 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
→ Slide 5
  • 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)
→ Slide 6
  • 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
→ Slide 7
  • 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
→ Slide 8
  • 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
→ Slide 9
  • 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
→ Slide 10

  • 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
→ Slide 11

IntelliTrace rejestruje zdarzenia zachodzące w czasie wykonywania aplikacji

→ Slide 12

→ Slide 13

Konfiguracja zdarzeń InteliTrace
Tools → Options → IntelliTrace

→ Slide 14

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

→ Slide 15

→ Slide 16

→ Slide 17

PerfTips - informacje o czasie wykonań fragmentów kodu umieszczonymi pomiędzy punktami przerwań debbugera

→ Slide 18
  • 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

→ Slide 19

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
→ Slide 20
  • 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
→ Slide 21

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
→ Slide 22

  • 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
→ Slide 23
  • 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
→ Slide 24
  • 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
→ Slide 25

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

→ Slide 27


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

→ Slide 28
  • 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
→ Slide 29
  • 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
→ Slide 30

  • 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
→ Slide 31

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

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

→ Slide 34
dotMemory dotTrace
→ Slide 35
  • 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
→ Slide 36