Śledzenie aplikacji platformy .NET za pomocą narzędzia PerfCollect

Ten artykuł dotyczy: ✔️ zestaw .NET Core 2.1 SDK i nowsze wersje

W przypadku napotkania problemów z wydajnością w systemie Linux zbieranie śladu za pomocą perfcollect polecenia może służyć do zbierania szczegółowych informacji o tym, co działo się na maszynie w momencie wystąpienia problemu z wydajnością.

perfcollect to skrypt powłoki bash, który używa zestawu Narzędzi śledzenia systemu Linux: następnej generacji (LTTng) do zbierania zdarzeń napisanych ze środowiska uruchomieniowego lub dowolnego źródła zdarzeń, a także wydajności do zbierania przykładów procesora CPU procesu docelowego.

Przygotowywanie maszyny

Wykonaj następujące kroki, aby przygotować maszynę do zbierania śladu wydajności za pomocą polecenia perfcollect.

Uwaga

Jeśli przechwytujesz dane z wewnątrz kontenera, kontener musi mieć odpowiednie możliwości. Minimalne wymagane możliwości to PERFMON i SYS_PTRACE. Jeśli przechwytywanie zakończy się niepowodzeniem z minimalnym zestawem, dodaj SYS_ADMIN możliwość do kontenera. Aby uzyskać więcej informacji na temat śledzenia aplikacji wewnątrz kontenerów przy użyciu narzędzia PerfCollect, zobacz Zbieranie diagnostyki w kontenerach.

  1. Pobierz plik perfcollect.

    curl -OL https://aka.ms/perfcollect
    
  2. Utwórz plik wykonywalny skryptu.

    chmod +x perfcollect
    
  3. Wymagania wstępne dotyczące śledzenia instalacji — są to rzeczywiste biblioteki śledzenia.

    sudo ./perfcollect install
    

    Spowoduje to zainstalowanie następujących wymagań wstępnych na maszynie:

    1. perf: podsystem Zdarzenia wydajności systemu Linux i aplikacja zbierająca/przeglądająca w trybie użytkownika. perf jest częścią źródła jądra systemu Linux, ale zwykle nie jest instalowany domyślnie.

    2. LTTng: służy do przechwytywania danych zdarzeń emitowanych w czasie wykonywania przez CoreCLR. Te dane są następnie używane do analizowania zachowania różnych składników środowiska uruchomieniowego, takich jak GC, JIT i pula wątków.

Najnowsze wersje platformy .NET Core i narzędzia wydajności systemu Linux obsługują automatyczne rozpoznawanie nazw metod dla kodu platformy.

W przypadku rozpoznawania nazw metod natywnych bibliotek DLL środowiska uruchomieniowego (takich jak libcoreclr.so) perfcollect zostaną rozpoznane symbole podczas konwertowania danych, ale tylko wtedy, gdy są obecne symbole tych plików binarnych. Aby uzyskać szczegółowe informacje, zobacz Pobieranie symboli dla natywnego środowiska uruchomieniowego .

Zbieranie śladu

  1. Mają dostępne dwie powłoki — jedną do kontrolowania śledzenia, o nazwie [Trace], i jedną do uruchamiania aplikacji, określanej jako [App].

  2. [Ślad] Rozpocznij zbieranie.

    sudo ./perfcollect collect sampleTrace
    

    Oczekiwane dane wyjściowe:

    Collection started.  Press CTRL+C to stop.
    
  3. [Aplikacja] Skonfiguruj powłokę aplikacji z następującymi zmiennymi środowiskowymi — umożliwia to śledzenie konfiguracji coreCLR.

    export DOTNET_PerfMapEnabled=1
    export DOTNET_EnableEventLog=1
    

    Uwaga

    Podczas wykonywania aplikacji przy użyciu platformy .NET 7 należy również ustawić DOTNET_EnableWriteXorExecute=0 oprócz powyższych zmiennych środowiskowych. Na przykład:

    export DOTNET_EnableWriteXorExecute=0
    

    Uwaga

    Program .NET 6 standardizuje prefiks DOTNET_ zamiast COMPlus_ zmiennych środowiskowych, które konfigurują zachowanie czasu wykonywania platformy .NET. COMPlus_ Jednak prefiks będzie nadal działać. Jeśli używasz poprzedniej wersji środowiska uruchomieniowego platformy .NET, nadal należy użyć prefiksu COMPlus_ dla zmiennych środowiskowych.

  4. [Aplikacja] Uruchom aplikację — pozwól jej uruchomić tak długo, jak to konieczne, aby przechwycić problem z wydajnością. Dokładna długość może być tak krótka, jak to konieczne, o ile wystarczająco przechwytuje przedział czasu, w którym występuje problem z wydajnością, który chcesz zbadać.

    dotnet run
    
  5. [Ślad] Zatrzymaj zbieranie — naciśnij klawisze CTRL+C.

    ^C
    ...STOPPED.
    
    Starting post-processing. This may take some time.
    
    Generating native image symbol files
    ...SKIPPED
    Saving native symbols
    ...FINISHED
    Exporting perf.data file
    ...FINISHED
    Compressing trace files
    ...FINISHED
    Cleaning up artifacts
    ...FINISHED
    
    Trace saved to sampleTrace.trace.zip
    

    Skompresowany plik śledzenia jest teraz przechowywany w bieżącym katalogu roboczym.

Wyświetlanie śladu

Istnieje wiele opcji wyświetlania zebranego śladu. Ślady najlepiej wyświetlać przy użyciu narzędzia PerfView w systemie Windows, ale można je wyświetlać bezpośrednio w systemie Linux przy użyciu PerfCollect samego elementu lub TraceCompass.

Wyświetlanie pliku śledzenia za pomocą narzędzia PerfCollect

Możesz użyć samego narzędzia perfcollect, aby wyświetlić zebrany ślad. W tym celu użyj następującego polecenia:

./perfcollect view sampleTrace.trace.zip

Domyślnie spowoduje to wyświetlenie śladu procesora CPU aplikacji przy użyciu polecenia perf.

Aby przyjrzeć się zdarzeń zebranych za pośrednictwem LTTngmetody , możesz przekazać flagę -viewer lttng w celu wyświetlenia poszczególnych zdarzeń:

./perfcollect view sampleTrace.trace.zip -viewer lttng

Spowoduje to wyświetlenie ładunku zdarzeń za pomocą babeltrace przeglądarki:

# [01:02:18.189217659] (+0.020132603) ubuntu-xenial DotNETRuntime:ExceptionThrown_V1: { cpu_id = 0 }, { ExceptionType = "System.Exception", ExceptionMessage = "An exception happened", ExceptionEIP = 139875671834775, ExceptionHRESULT = 2148734208, ExceptionFlags = 16, ClrInstanceID = 0 }
# [01:02:18.189250227] (+0.020165171) ubuntu-xenial DotNETRuntime:ExceptionCatchStart: { cpu_id = 0 }, { EntryEIP = 139873639728404, MethodID = 139873626968120, MethodName = "void [helloworld] helloworld.Program::Main(string[])", ClrInstanceID = 0 }

Otwieranie pliku śledzenia za pomocą narzędzia PerfView

Aby wyświetlić zagregowany widok przykładu procesora CPU i zdarzeń, możesz użyć PerfView go na maszynie z systemem Windows.

  1. Skopiuj plik trace.zip z systemu Linux do maszyny z systemem Windows.

  2. Pobierz aplikację PerfView z witryny https://aka.ms/perfview.

  3. Uruchamianie PerfView.exe

    PerfView.exe <path to trace.zip file>
    

Widok PerfView wyświetli listę widoków obsługiwanych na podstawie danych zawartych w pliku śledzenia.

  • W przypadku badań procesora CPU wybierz pozycję Stosy procesora CPU.

  • Aby uzyskać szczegółowe informacje o GC, wybierz pozycję GCStats.

  • W przypadku informacji dotyczących trybu JIT dla poszczególnych procesów/modułów/metody wybierz pozycję JITStats.

  • Jeśli nie ma widoku potrzebnych informacji, możesz spróbować wyszukać zdarzenia w widoku nieprzetworzonych zdarzeń. Wybierz pozycję Zdarzenia.

Aby uzyskać więcej informacji na temat interpretowania widoków w programie PerfView, zobacz linki pomocy w samym widoku lub w oknie głównym w programie PerfView, wybierz pozycję Przewodnik dla użytkowników pomocy>.

Uwaga

Zdarzenia zapisywane za pośrednictwem System.Diagnostics.Tracing.EventSource interfejsu API (w tym zdarzenia z platformy Framework) nie będą wyświetlane pod nazwą dostawcy. Zamiast tego są one zapisywane jako EventSourceEvent zdarzenia w ramach Microsoft-Windows-DotNETRuntime dostawcy, a ich ładunki są serializowane w formacie JSON.

Uwaga

Jeśli obserwujesz [unknown] /memfd:doublemapper ramki w nazwach metod i stosach wywołań, ustaw DOTNET_EnableWriteXorExecute=0 przed uruchomieniem aplikacji, którą śledzisz za pomocą narzędzia perfcollect.

Otwieranie pliku śledzenia za pomocą narzędzia TraceCompass

Eclipse TraceCompass to inna opcja, której można użyć do wyświetlania śladów. TraceCompass działa również na maszynach z systemem Linux, więc nie trzeba przenosić śledzenia na maszynę z systemem Windows. TraceCompass Aby otworzyć plik śledzenia, musisz rozpakować plik.

unzip myTrace.trace.zip

perfcollect Program zapisze ślad LTTng zebrany w formacie pliku CTF w podkatalogu w pliku lttngTrace. W szczególności plik CTF będzie znajdować się w katalogu, który wygląda następująco: lttngTrace/auto-20201025-101230\ust\uid\1000\64-bit\.

Możesz otworzyć plik śledzenia CTF, TraceCompass wybierając File -> Open Trace i wybierając metadata plik.

Aby uzyskać więcej informacji, zapoznaj się z TraceCompass dokumentacją.

Pobieranie symboli dla natywnego środowiska uruchomieniowego

Przez większość czasu interesuje Cię własny kod, który perfcollect jest domyślnie rozpoznawany. Czasami warto zobaczyć, co dzieje się wewnątrz bibliotek DLL platformy .NET (co było w ostatniej sekcji), ale czasami to, co dzieje się w natywnych bibliotekach dll środowiska uruchomieniowego (zazwyczaj libcoreclr.so), jest interesujące. perfcollect Program rozpozna symbole tych symboli podczas konwertowania danych, ale tylko wtedy, gdy symbole dla tych natywnych bibliotek DLL są obecne (i znajdują się obok biblioteki, dla której znajdują się).

Istnieje globalne polecenie o nazwie dotnet-symbol , które to robi. Aby użyć symbolu dotnet-, aby uzyskać natywne symbole środowiska uruchomieniowego:

  1. Zainstaluj program dotnet-symbol:

    dotnet tool install -g dotnet-symbol
    
  2. Pobierz symbole. Jeśli zainstalowana wersja środowiska uruchomieniowego platformy .NET Core to 2.1.0, polecenie, które należy wykonać, to:

    mkdir mySymbols
    dotnet symbol --symbols --output mySymbols  /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0/lib*.so
    
  3. Skopiuj symbole do poprawnego miejsca.

    sudo cp mySymbols/* /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0
    

    Jeśli nie można tego zrobić, ponieważ nie masz dostępu do zapisu do odpowiedniego katalogu, możesz użyć perf buildid-cache polecenia , aby dodać symbole.

Następnie podczas uruchamiania perfcollectpolecenia należy uzyskać nazwy symboliczne dla natywnych bibliotek dll.

Zbieranie w kontenerze platformy Docker

Aby uzyskać więcej informacji na temat używania perfcollect w środowiskach kontenerów, zobacz Zbieranie diagnostyki w kontenerach.

Dowiedz się więcej o opcjach kolekcji

Możesz określić następujące opcjonalne flagi, perfcollect aby lepiej dopasować je do potrzeb diagnostycznych.

Zbieranie dla określonego czasu trwania

Jeśli chcesz zebrać ślad dla określonego czasu trwania, możesz użyć -collectsec opcji, po której następuje liczba określająca łączną liczbę sekund do zebrania śladu.

Zbieranie śladów czasu wątku

Określanie za pomocą -threadtimeperfcollect polecenia umożliwia zbieranie danych użycia procesora CPU dla każdego wątku. Dzięki temu można analizować, gdzie każdy wątek spędzał czas procesora CPU.

Zbieranie śladów dla wydajności pamięci zarządzanej i modułu odśmiecającego pamięci

Poniższe opcje umożliwiają zbieranie zdarzeń GC ze środowiska uruchomieniowego.

  • perfcollect collect -gccollectonly

Zbierz tylko minimalny zestaw zdarzeń kolekcji GC. Jest to najmniej pełny profil zbierania zdarzeń GC z najniższym wpływem na wydajność aplikacji docelowej. To polecenie jest analogiczne do PerfView.exe /GCCollectOnly collect polecenia w programie PerfView.

  • perfcollect collect -gconly

Zbierz więcej pełnych zdarzeń kolekcji GC za pomocą zdarzeń JIT, Loader i Exception. To żądanie bardziej pełnych zdarzeń (takich jak informacje o alokacji i informacje o dołączeniu GC) i będzie miało większy wpływ na wydajność aplikacji docelowej niż -gccollectonly opcja. To polecenie jest analogiczne do PerfView.exe /GCOnly collect polecenia w programie PerfView.

  • perfcollect collect -gcwithheap

Zbierz najbardziej pełne wydarzenia kolekcji GC, które śledzą również przetrwanie sterta i ruchy. Zapewnia to szczegółową analizę zachowania GC, ale spowoduje naliczenie wysokiego kosztu wydajności, ponieważ każdy GC może trwać więcej niż dwa razy dłużej. Zaleca się zapoznanie się z wpływem wydajności użycia tej opcji śledzenia podczas śledzenia w środowiskach produkcyjnych.