Udostępnij za pośrednictwem


Laboratorium 2.2 Przechwytywanie plików zrzutu za pomocą narzędzia ProcDump w systemie Linux

Dotyczy: .NET Core 2.1, .NET Core 3.1, .NET 5

W tym artykule omówiono instalację narzędzia ProcDump oraz sposób przechwytywania plików zrzutu pamięci platformy .NET Core przy użyciu narzędzia ProcDump w systemie Linux.

Wymagania wstępne

Minimalne wymagania dotyczące tych laboratoriów rozwiązywania problemów są następujące:

  • Aplikacja ASP.NET Core demonstruje problemy z wydajnością procesora CPU i procesora CPU o wysokiej wydajności oraz problemy z awariami.
  • Debuger lldb, zainstalowany i skonfigurowany do ładowania rozszerzenia SOS po otwarciu pliku zrzutu podstawowego.

Jeśli wykonano poprzednie części tej serii, musisz mieć następującą konfigurację gotową do użycia:

  • Serwer Nginx jest skonfigurowany do hostowania dwóch witryn internetowych:
    • Pierwszy nasłuchuje żądań przy użyciu nagłówka hosta myfirstwebsite (http://myfirstwebsite) i routingu żądań do aplikacji demonstracyjnej ASP.NET Core, która nasłuchuje na porcie 5000.
    • Drugi nasłuchuje żądań przy użyciu nagłówka hosta buggyamb (http://buggyamb) i routingu żądań do drugiej ASP.NET Core przykładowej aplikacji usterek, która nasłuchuje na porcie 5001.
  • Obie aplikacje ASP.NET Core powinny być uruchomione jako usługi, które są uruchamiane automatycznie po ponownym uruchomieniu serwera lub aplikacja przestaje odpowiadać.
  • Zapora lokalna systemu Linux jest włączona i skonfigurowana do zezwalania na ruch SSH i HTTP.

Uwaga 16.

Jeśli konfiguracja nie jest gotowa, przejdź do sekcji "Part 2 Create and run ASP.NET Core apps" (Część 2 Tworzenie i uruchamianie aplikacji ASP.NET Core).

Cel tego laboratorium

W poprzednich laboratoriach przedstawiono sposób analizowania problemu z awarią lub wydajnością. Użyto narzędzia createdump do przechwytywania plików zrzutu.

Teraz zainstalujesz plik ProcDump i przechwycisz pliki zrzutu podstawowego przy użyciu narzędzia ProcDump. Będzie to zakres tego laboratorium, ponieważ będziesz pracować w tym samym scenariuszu, który został zbadany w poprzedniej części.

ProcDump

Zgodnie z oficjalną stroną wersji systemu Linux ProcDump, "ProcDump jest reimagining systemu Linux klasycznego narzędzia ProcDump z zestawu narzędzi Sysinternals dla systemu Windows."

Wersja systemu Linux ma pewne ograniczenia w porównaniu z wersją systemu Windows. Nie obsługuje każdej funkcji, którą oferuje wersja narzędzia systemu Windows. Nie można na przykład skonfigurować go do zbierania plików zrzutu podstawowego, gdy proces ulega awarii lub zgłasza wyjątek pierwszej szansy.

Jednak nadal jest potężny. Poniższa lista opcji wiersza polecenia jest długa w celu udowodnienia siły narzędzia:

-C: Trigger core dump generation when CPU exceeds or equals specified value (0 to 100 * nCPU)
-c: Trigger core dump generation when CPU is less than specified value (0 to 100 * nCPU)
-M: Trigger core dump generation when memory commit limit exceeds or equals specified value (MB)
-m: Trigger core dump generation when memory commit limit is less than specified value (MB)
-T: Trigger core dump generation when thread count exceeds or equals specified value.
-F: Trigger core dump generation when filedescriptor count exceeds or equals specified value.

Instrukcje instalacji zostały szczegółowo opisane w temacie Install ProcDump (Instalowanie narzędzia ProcDump). Pamiętaj, że przed zainstalowaniem platformy .NET Core zostało wyświetlone polecenie dodania repozytorium pakietów firmy Microsoft. ProcDump używa tego samego repozytorium. W związku z tym narzędzie można zainstalować bezpośrednio przy użyciu sudo apt install procdump polecenia .

Zrzut ekranu przedstawiający polecenie sudo apt install procdump.

Za pomocą narzędzia ProcDump można monitorować użycie procesora CPU, pamięci, wątku lub deskryptora plików.

Za pomocą narzędzia ProcDump można przechwycić plik zrzutu pamięci, gdy użycie procesora CPU lub pamięci docelowego procesu osiągnie określony próg lub spadnie poniżej wartości limitu. Jednak w tym ćwiczeniu użyjesz najprostszej metody w celu wywołania narzędzia: procdump -p <PID>. Spowoduje to ręczne utworzenie pliku zrzutu procesu.

Przechwyć plik zrzutu pamięci tego samego procesu. Zwróć uwagę, że musisz uruchomić polecenie przy użyciu polecenia sudo.

Zrzut ekranu przedstawiający polecenie sudo procdump.

Gdzie procDump tworzy pliki zrzutu podstawowego?

To są informacje, które z pewnością musisz wiedzieć. Możesz poświęcić dużo czasu, próbując dowiedzieć się, gdzie są tworzone pliki zrzutu, gdy procDump jest używany do przechwytywania podstawowych plików zrzutu.

Dane wyjściowe ProcDump nie są jasne, gdzie są tworzone podstawowe pliki zrzutu. Jak pokazano na poprzednim zrzucie ekranu, dane wyjściowe po prostu zapisują nazwę pliku, ale nie rzeczywistą ścieżkę.

Ponieważ inne narzędzia zwykle używają /tmp/ lub /var/lib/systemd/coredump/ katalogów, można pomyśleć, że ProcDump używa również jednego z tych katalogów. Jednak tak nie jest. Zamiast tego pliki zrzutu przechwycone przez narzędzie ProcDump są tworzone w katalogu roboczym aplikacji ASP.NET Core.

Katalog roboczy aplikacji jest zdefiniowany w pliku jednostki sterowania usługi. Jak widać na poniższym zrzucie ekranu, katalog roboczy przykładowej aplikacji to /var/BuggyAmb_v1.1. W związku z tym każdy plik zrzutu tworzony przez narzędzie ProcDump dla tej aplikacji zostanie umieszczony w katalogu /var/BuggyAmb_v1.1 .

Zrzut ekranu przedstawiający kota i polecenie ll.

Przykładowy scenariusz: przechwytywanie plików zrzutu na podstawie użycia pamięci

Rozważmy następujący scenariusz:

  • Występuje wysokie użycie pamięci w aplikacji ASP.NET Core, która jest hostowana.
  • Duże zużycie pamięci występuje losowo i nie wiesz, jak odtworzyć problem. Wiesz tylko, że problem rozpoczyna się, gdy użycie pamięci zatwierdzenia dla procesu hostujące aplikację osiągnie 750 MB.
  • Ponieważ nie można stale monitorować użycia pamięci, chcesz zautomatyzować proces zbierania zrzutów. Twoim celem jest przechwycenie dwóch kolejnych plików zrzutu tego samego procesu po przekroczeniu progu 750 MB użycia pamięci.
  • Chcesz przechwycić dwa pliki zrzutu pamięci z co najmniej pięciosekundowym interwałem między generowaniem plików zrzutu pierwszej i drugiej pamięci.

Zgodnie z ProcDump Help, oto przełączniki, których będziesz musiał użyć:

  • -M: Wyzwalanie generowania pliku zrzutu rdzenia, gdy zatwierdzenie pamięci przekracza lub równa określonej wartości (MB)
  • -n: liczba podstawowych plików zrzutu do zapisu przed zakończeniem (wartość domyślna to 1)
  • -s: Kolejne sekundy przed zapisem pliku zrzutu (wartość domyślna to 10)
  • -d: Zapisywanie dzienników diagnostycznych w usłudze Syslog
  • -p: PID procesu

Uruchom polecenie sudo procdump -p 11724 -n 2 -s 5 -M 750. Zobaczysz, że procDump czeka, aż kryteria zdefiniowane przez argumenty przekazane do niego zostaną spełnione lub dopóki nie zdecydujesz się zakończyć fazy monitorowania, naciskając Ctrl+C.

Zrzut ekranu przedstawiający polecenie sudo procdump p.

Podczas gdy procDump monitoruje użycie pamięci, odtwórz ten sam problem, wysyłając sześć żądań do scenariusza Powolne przy użyciu Load Generator funkcji aplikacji internetowej ponownie. Po osiągnięciu progu użycia pamięci narzędzie ProcDump tworzy pliki zrzutu. Poniższy zrzut ekranu przedstawia dwa przechwycone pliki zrzutu.

Zrzut ekranu przedstawiający polecenie sudo procdump p n.

Pliki zrzutu są zapisywane w katalogu roboczym, tak samo jak w przypadku utworzonego wcześniej pliku zrzutu pamięci ręcznej.

Zrzut ekranu przedstawiający polecenie ls.

Pliki zrzutu tworzone przy użyciu polecenia createdump i ProcDump są identyczne pod względem informacji, które zawierają. Możesz wybrać niezależnie od tego, które narzędzie jest lepiej dopasowane do scenariusza, z którym napotykasz podczas rozwiązywania takich problemów.

Następne kroki

Laboratorium 3 Rozwiązywanie problemów z wydajnością i GC przy użyciu polecenia dotnet-dump w systemie Linux

W laboratorium 3 omówiono inne opcje pracy z plikami zrzutu pamięci przy użyciu elementów dotnet-dump i dotnet-gcdump.