Ś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.
Pobierz plik
perfcollect
.curl -OL https://aka.ms/perfcollect
Utwórz plik wykonywalny skryptu.
chmod +x perfcollect
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:
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.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
Mają dostępne dwie powłoki — jedną do kontrolowania śledzenia, o nazwie [Trace], i jedną do uruchamiania aplikacji, określanej jako [App].
[Ślad] Rozpocznij zbieranie.
sudo ./perfcollect collect sampleTrace
Oczekiwane dane wyjściowe:
Collection started. Press CTRL+C to stop.
[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_
zamiastCOMPlus_
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ć prefiksuCOMPlus_
dla zmiennych środowiskowych.[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
[Ś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 LTTng
metody , 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.
Skopiuj plik trace.zip z systemu Linux do maszyny z systemem Windows.
Pobierz aplikację PerfView z witryny https://aka.ms/perfview.
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:
Zainstaluj program
dotnet-symbol
:dotnet tool install -g dotnet-symbol
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
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 perfcollect
polecenia 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ą -threadtime
perfcollect
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.