13 Oprogramowanie do profilowania w celu debugowania Problem z wydajnością aplikacji

Celem Twojej aplikacji jest dobra obsługa użytkowników końcowych.

Musi być szybki, responsywny, łatwy w użyciu i niezawodny, a także posiadać inne pożądane funkcje.

Jednak utrzymywanie oprogramowania w sposób, który zapewnia najwyższą wydajność, nie jest takie proste.

Kiedy twój kod zaczyna wywoływać niepotrzebne funkcje, potyka się o siebie, łapie błędy i wchodzi w dodatkowe pętle, może to spowodować nieefektywność. Twoja aplikacja może stać się powolna, przestać odpowiadać lub zachowywać się nieprawidłowo.

A jeśli nie rozwiążesz tych problemów, ogólna wydajność aplikacji ulegnie pogorszeniu.

W rezultacie Twoi klienci mogą się zirytować lub całkowicie przestać korzystać z Twojej aplikacji z powodu słabej wydajności i niskiej szybkości. Nie tylko pogarsza twoją reputację, ale także generuje koszty w postaci przychodów i zysków. Dlatego Twój kod musi być analizowany, przeglądany i debugowany, aby osiągnąć optymalną wydajność. Szybkim sposobem na to jest użycie narzędzia do profilowania oprogramowania do monitorowania i debugowania kodów oraz eliminowania wąskich gardeł związanych z wydajnością.

W tym artykule dowiesz się o profilowaniu oprogramowania i o tym, jak może ci ono pomóc. Następnie przeprowadzę Cię przez niektóre z najlepszych narzędzi do profilowania, aby debugować aplikację i optymalizować jej wydajność.

Co to jest profilowanie oprogramowania?

Profilowanie oprogramowania to dynamiczna analiza kodu, w której zachowanie programu jest badane na podstawie danych zbieranych podczas działania programu. Ma na celu określenie różnych sekcji programu, które należy zoptymalizować, aby zwiększyć szybkość aplikacji, responsywność oraz zmniejszyć zużycie pamięci i zasobów.

Profiler programowy zwykle mierzy czas trwania i częstotliwość wywołań funkcji wraz z pamięcią lub złożonością czasową związaną z programem. Dostępne są również określone profilery, takie jak profilery pamięci.

Profilowanie jest zwykle wykonywane przez instrumentację kodu źródłowego programu. Profilerzy mogą korzystać z różnych technik profilowania, takich jak metody instrumentalne, oparte na zdarzeniach, statystyczne lub symulacyjne.

Dlaczego profilowanie oprogramowania ma znaczenie?

Profilowanie oprogramowania jest potrzebne do określenia wykorzystania zasobów i czasu wykonania związanego z określoną funkcją. Pomaga zoptymalizować szybkość programu, a jednocześnie zapewnia minimalne zużycie zasobów.

Ponadto ma to na celu śledzenie i optymalizację wykorzystania procesora oraz czasu wykonywania poleceń.

Dlatego wybór odpowiedniego narzędzia do profilowania oprogramowania jest niezbędny, aby zapewnić szybsze debugowanie problemów związanych z wydajnością, aby poprawić jego wydajność i zapewnić lepszą obsługę użytkownika końcowego. Wiele profilerów zawiera również szczegółowe raporty oraz interaktywne wykresy i wizualizacje, które pomagają znaleźć dokładną przyczynę problemów, ułatwiając ich rozwiązanie.

Oto lista najlepszych programów do profilowania oprogramowania, które możesz wypróbować, i powiedz nam, co zadziałało najlepiej.

py-szpieg

py-szpieg jest doskonałym profilerem próbkowania dla Pythona. Dzięki temu możesz rzucić okiem na wszystkie rzeczy, na które Twoja aplikacja oparta na Pythonie spędza czas.

W tym celu nie musisz modyfikować swoich kodów ani całkowicie ponownie uruchamiać programu. py-spy wymaga niskiego narzutu i został opracowany w Rust w celu uzyskania większej szybkości. Nie jest zbudowany do działania w tym samym procesie, w którym działa profilowany program oparty na Pythonie. Oznacza to, że py-spy jest wysoce bezpieczny w użyciu przeciwko kodom produkcyjnym opartym na Pythonie.

Narzędzie umożliwia rejestrowanie profili, generowanie wykresów płomienia do tworzenia interaktywnych plików SVG. Możesz także wyświetlić inne opcje, takie jak zmiana częstotliwości próbkowania, natywne rozszerzenia C do profilowania, podprocesy, identyfikatory wątków i inne. Możesz uzyskać podgląd na żywo funkcji zachodzących w twoich programach za pomocą polecenia „top” i wyświetlić aktualny stos wywołań za pomocą polecenia „dump” dla każdego wątku Pythona.

Obsługuje każdą wersję interpretera CPython, taką jak 2.3 – 2.7 i 3.3 – 3.8. Możesz zainstalować py-spy z PyPI lub GitHub.

Piroskop

Oprogramowanie do ciągłego profilowania o otwartym kodzie źródłowym Piroskop pomaga debugować wszystkie problemy z wydajnością w aplikacji w ciągu kilku minut.

Możesz uruchomić serwer, a następnie agenta, bez względu na to, czego używasz, Docker, Linux lub szukasz dokumentów Ruby lub Go, Pyroscope obejmuje Cię. Nawet jeśli masz na celu dziesięć sekund lub dziesięć miesięcy danych profilowania oprogramowania, ich specjalnie zaprojektowany mechanizm pamięci masowej wykonuje szybkie zapytania.

Nie musisz się martwić o koszty ogólne ani wydajność aplikacji, ponieważ używają one technologii profilowania próbkowania, która nie wpływa na wydajność. Pyroscope wydajnie przechowuje Twoje dane profilowe; dlatego jest to dla Ciebie opłacalne, nawet jeśli chcesz przechowywać różne dane profilowe z różnych aplikacji przez lata.

Działa na systemach macOS, Linux i Docker oraz obsługuje programy napisane w językach Python, Go i Ruby.

Bubbleprof

Bubbleprof by Clinic.js zapewnia świeży i unikalny sposób profilowania oprogramowania napisanego w Node.js. Korzysta z interfejsu użytkownika „bąbelkowego”, który pomaga wszystkim, od ekspertów po początkujących, określić asynchroniczny czas spędzony w Twojej aplikacji.

Wizualizuje, jak działają procesy Node.js, obserwując jego asynchroniczne operacje, grupując je, obliczając opóźnienia i mapując je.

Bubbleprof określa czasy operacji, patrząc na rozmiar bąbelków w określonej grupie operacji, którymi może być Twój kod, rdzeń węzła lub moduł. Łączy również sąsiednie grupy, aby zmniejszyć bałagan.

Aby obliczyć opóźnienia w przepływie operacji z jednej grupy do drugiej, Bubbleprof mierzy długość strzałki łączącej bąbelki. Oprócz tego wykorzystuje również różne kolory w procesach pomiarowych. Jednocześnie wewnętrzne kolorowe linie przedstawiają mieszankę typów operacji asynchronicznych jako przyczynę opóźnienia.

Pyinstrument

Zoptymalizuj swoje kody Pythona za pomocą Pyinstrument.

Pokazuje, dlaczego Twój kod Pythona działa wolno, i pomaga zdiagnozować problemy, dzięki czemu możesz uzyskać tak niesamowitą wydajność.

Aby używać Pyinstrument, nie musisz pisać skryptu w Pythonie; po prostu wywołaj Pyinstrument bezpośrednio z wiersza poleceń. Twój skrypt działałby normalnie, a narzędzie wyświetliłoby kolorowe podsumowanie obszarów, w których aplikacja spędzała czas. Jest również wyposażony w interfejs API Pythona, który jeszcze bardziej upraszcza ten proces.

Masz również możliwość profilowania żądań sieciowych w Flask i Django, dla których utrzymywali szczegółową dokumentację. W tym miejscu należy pamiętać, że Pyinstrument oferuje profilowanie statystyczne, które rejestruje stos wywołań co 1 ms zamiast śledzenia każdego wywołania funkcji wykonanego przez program.

Jest to korzystne, ponieważ profilery statystyczne wiążą się z mniejszym narzutem w porównaniu z profilerami śledzenia. Ponieważ rejestruje cały stos, śledzenie kosztownych wywołań funkcji staje się łatwe. Oprócz tego Pyinstrument ukrywa również (domyślnie) ramki bibliotek, pozwalając skupić się na aplikacjach lub modułach odpowiedzialnych za wpływ na wydajność.

Debugowanie problemów z wydajnością jest łatwiejsze, ponieważ Pyinstrument rejestruje czas spędzony przy użyciu czasu „zegara ściennego”. Narzędzie śledzi cały czas programu na odczyt plików, pobieranie danych, komunikację z bazą danych itp.

Xdebug

Aby poprawić problemy z wydajnością kodu i sprawić, by programowanie było trochę przyjemniejsze, Xdebug jest wyposażony w szerokie możliwości profilowania i debugowania.

W rzeczywistości jest to rozszerzenie PHP, które pozwala znaleźć wąskie gardła w aplikacji PHP i przeanalizować jej wydajność za pomocą zewnętrznych narzędzi wizualizacyjnych do generowania wykresów wydajności.

Xdebug tworzy szczegółowe dane wyjściowe pokazujące ścieżkę aplikacji do osiągnięcia błędu, w tym parametry, które przekazała do danej funkcji. Ma to na celu śledzenie błędów. Aby pomóc programistom w jasnym zrozumieniu rzeczy, generuje informacje oznaczone kolorami wraz z widokami strukturalnymi.

Jest również wyposażony w zdalny debugger, którego można użyć do połączenia Xdebug z uruchomionym kodem, IDE lub przeglądarką, aby zobaczyć punkty przerwania kodu i wykonać kody linia po linii. Kolejną funkcją, którą oferuje, jest pokrycie kodu, które pokazuje, ile kodu programu zostało wykonane, a także pomaga w testach jednostkowych.

SPX

Proste rozszerzenie profilowania (SPX) jest rozszerzeniem profilowania przeznaczonym dla PHP. Ma kilka unikalnych właściwości, które odróżniają go od innych rozszerzeń profilowania. Jest całkowicie BEZPŁATNY w użyciu i ograniczony tylko do Twojej infrastruktury, co oznacza, że ​​nie ma ryzyka wycieku danych.

Prostota SPX czyni go bardzo łatwym w użyciu: wystarczy ustawić wiersz poleceń lub zmienną środowiskową, aby sprofilować skrypt. Lub możesz także włączyć przycisk radiowy na stronie internetowej, aby profilować skrypt. W rezultacie nie trzeba ręcznie instrumentować kodu.

Obsługuje również uruchomiony skrypt wiersza poleceń – Ctrl-C. Oprócz tego proces ten eliminuje również potrzebę korzystania z programu uruchamiającego z wiersza poleceń lub dedykowanego rozszerzenia przeglądarki. SPX obsługuje wiele metryk około 22, w tym różne metryki czasu i pamięci, obiekty, używane pliki, wejścia/wyjścia itp.

Może gromadzić dane bez opuszczania kontekstu. Jego internetowy interfejs użytkownika umożliwia konfigurowanie/włączanie profilowania dla aktualnie używanej sesji przeglądarki i wyświetla listę wszystkich profilowanych szczegółów skryptów i raportów. Internetowy interfejs użytkownika pozwala wybrać konkretny raport do głębszej analizy i zawiera interaktywne wizualizacje, takie jak Flamegraph, płaski profil i oś czasu, które można skalować do wywołań funkcji w milionach.

Prefiks

Prefiks by Stackify to łatwy w instalacji i lekki program do profilowania kodu, który uwielbia wielu programistów. Pomaga wyeliminować wąskie gardła w wydajności aplikacji, aby ją zoptymalizować i poprawić wrażenia użytkownika.

Doskonałe możliwości śledzenia i profilowania Prefix umożliwiają szybkie znajdowanie ukrytych wyjątków, powolnych zapytań SQL i nie tylko. Zapewnia Twoim programistom prawdziwą moc APM (monitorowanie wydajności aplikacji). W tym celu Prefix weryfikuje wydajność kodu w taki sposób, w jaki jest napisany, i pozwala wypchnąć kody o lepszej wydajności do przetestowania.

W ten sposób otrzymuje mniej zgłoszeń do pomocy technicznej od strony produkcyjnej i pomaga menedżerom ds. rozwoju szybciej osiągnąć cele. Odkryj wszystkie zapytania o niskiej wydajności, nieznane wąskie gardła i zapytania generowane przez ORM.

Możesz także śledzić każdy parametr wywołania SQL, pobierać chronometraż i przeglądać rekordy, których dotyczy problem. Prefiks ułatwia również wykrywanie wzorców N+1. Zapomnij o sortowaniu tych wszystkich niechlujnych dzienników; połącz je, aby łatwo zlokalizować problemy.

Prefix pozwala bezpośrednio znaleźć kontekst podejrzanego dziennika w żądaniu zapytania i przeskoczyć z jednego dziennika do śladu w celu bezproblemowego debugowania. Prefiks rzuca światło na słabo działające zależności, co jest przydatne do znajdowania ukrytych wyjątków i pracy ze starszymi sekcjami kodu lub struktury. Tymi zależnościami mogą być usługi internetowe, usługi innych firm, usługi pamięci podręcznej i inne.

Prefix działa w systemach Windows i Mac i obsługuje platformy .Net, Ruby, Java, PHP, Python i Node.js.

Różnoboczny

Różnoboczny jest wysoce precyzyjnym, wydajnym profilerem GPU, CPU i pamięci dla programów opartych na Pythonie. Oferuje kilka zalet w porównaniu z innymi profilerami, takimi jak uruchamianie zamówień o większej wielkości i dostarczanie bardziej szczegółowych informacji.

Scalene jest niewiarygodnie szybki i wykorzystuje samplowanie zamiast oprzyrządowania. Nie opiera się nawet na funkcjach śledzenia Pythona. Poza tym jego koszty ogólne wynoszą zwykle poniżej 10-20%. To narzędzie wykonuje profilowanie oprogramowania na poziomie linii i wskazuje te linie kodu, które odpowiadają za czas wykonania Twojego programu.

Te szczegóły są bardziej wartościowe niż te przy profilowaniu na poziomie funkcji. Scalene oddziela czas spędzony wyłącznie w Pythonie od natywnego kodu zawierającego biblioteki. Ponieważ większość programistów Pythona nie optymalizuje wydajności kodu natywnego, programiści mogą skoncentrować swoje wysiłki na optymalizacji kodu, który można faktycznie poprawić.

Podświetla hotspoty na czerwono, które ułatwiają wykrywanie czasu procesora/przydziału pamięci i łatwe oddzielanie czasu systemowego w celu znalezienia problemów z wejściami/wyjściami. Scalene może raportować czas GPU, profilować użycie pamięci i śledzić użycie procesora. Scalene może również identyfikować możliwe wycieki pamięci, wolumen kopiowania profili i generować zredukowane profile dla linii kodu zużywających więcej niż 1% procesora.

VisualVM

Uniwersalne narzędzie do rozwiązywania problemów z Javą, VisualVM, jest przeznaczony do stosowania zarówno w fazie produkcji, jak i rozwoju. Jest to oprogramowanie wizualne, które integruje lekkie funkcje profilowania i narzędzia JDK wiersza poleceń.

VisualVM monitoruje aplikacje działające w Javie 1.4+ i rozwiązuje z nimi problemy przy użyciu kilku technologii, takich jak JMX, jvmstat, Attach API i Serviceability Agent. To narzędzie idealnie pasuje do różnych wymagań inżynierów jakości, administratorów systemów i użytkowników końcowych.

Automatycznie wykrywa zdalnie i lokalnie uruchomione aplikacje oparte na Javie i wyświetla je. Narzędzie umożliwia również ręczne definiowanie programów za pomocą połączenia JMX. Dla każdego procesu pokazuje typowe dane uruchomieniowe, takie jak PID, przekazane argumenty, strona główna JDK, klasa główna, flagi JVM, wersja JVM oraz właściwości systemu i argumentów.

VisualVM monitoruje użycie procesora, stertę i metaprzestrzeń lub pamięć stałej generacji, uruchomione wątki i załadowane klasy w aplikacji. Wyświetla wszystkie uruchomione wątki na osi czasu z zagregowanymi czasami uśpienia, działania, parkowania, monitorowania i oczekiwania.

Zarówno oprzyrządowanie, jak i profilery próbkowania można wykonać przy użyciu VisualVM do zarządzania pamięcią i wydajności aplikacji. Wyświetla zrzuty wątków, aby zapewnić szybki wgląd w procesy. Wyświetla również i tworzy migawki .hprof na żądanie, aby pomóc Ci wykryć nieefektywne użycie sterty i debugować wycieki pamięci.

Ponadto VisualVM może odczytywać podstawowe dane dotyczące uszkodzonego procesu opartego na Javie wraz z jego środowiskiem. Możesz analizować swoje aplikacje offline; może zapisywać środowisko uruchomieniowe aplikacji i konfigurację z wykonanymi zrzutami sterty, zrzutami wątków i migawkami profilowania, które można przetwarzać w trybie offline na późniejszym etapie.

Działa w systemach Windows, Linux i Unix.

Profiler orbity

Wizualizuj swoją aplikację C/C++ i szybko znajduj problemy z wydajnością Profiler orbity. Jest to narzędzie do debugowania i samodzielny profiler, którego celem jest pomoc programistom w przeglądaniu i zrozumieniu przepływu wykonywania złożonej aplikacji.

Zapewnia ostry wgląd we wszystko, co dzieje się w aplikacji, dzięki czemu można szybko wyeliminować wąskie gardła wydajności i przywrócić wysoką wydajność aplikacji.

Orbit Profiler może wydajnie pracować z dowolną aplikacją C lub C++, pod warunkiem, że ma dostęp do pliku PDB. Następnie rozpocznie profilowanie po zakończeniu pobierania programu. Narzędzie przeskakuje do docelowego procesu, podpina się do wybranych funkcji i wykonuje profilowanie.

Może nawet działać na zoptymalizowanych kompilacjach końcowych lub wysyłkowych. Oprócz dynamicznego oprzyrządowania, Orbit Profiler oferuje również możliwości próbkowania „zawsze włączone”, które jest szybkie, dostępne przez cały czas i solidne.

Działa w systemach Windows i Linux.

Uber JVM Profiler

Wyposażony w zaawansowane możliwości profilowania, Uber JVM Profiler to kolejna dobra opcja dla aplikacji opartych na Javie.

Oferuje agenta Java, który zbiera kilka śladów stosu i metryki dla procesów Spark/Hadoop JVM w sposób rozproszony, na przykład metryki pamięci/CPU/IO.

Narzędzie może śledzić argumenty i metody Java w kodach użytkownika bez ich zmiany. Można go również użyć do śledzenia opóźnienia wywołania węzłów nazw systemu plików HDFS dla każdej aplikacji platformy Spark i znajdowania problemów. Może nawet śledzić ścieżki plików HDFS aplikacji Spark, aby znaleźć gorące pliki i przeprowadzić dalszą optymalizację.

Uber JVM Profiler został pierwotnie stworzony w celu profilowania aplikacji Spark, które zazwyczaj obejmują wiele maszyn lub procesów dla jednej aplikacji. W związku z tym ludzie mogą łatwo skorelować metryki dla tych maszyn lub procesów.

Jednak narzędzie działa jak typowy agent Java i można go używać do dowolnego procesu JVM. Jego funkcje obejmują:

  • Debugowanie wykorzystania pamięci przez moduły wykonawcze aplikacji Spark, takie jak pamięć sterty Java, pamięć natywna, pamięć bez sterty, pula buforów i pula pamięci
  • Debugowanie użycia procesora i czasu zbierania śmieci
  • Debugowanie metod klasy Java pod kątem ich częstotliwości i czasu lub Profilowanie czasu trwania
  • Profilowanie argumentów (debugowanie i śledzenie wywołania metody klasy java i jej wartości argumentu)
  • Stacktrack Profilowanie i generowanie Flamegraphów dla czasu procesora
  • Debugowanie metryk we/wy i metryk wątków JVM

Tracy

Tracy to przydatne narzędzie ułatwiające programistom debugowanie programów PHP. Ma przyjazny design i zaawansowane funkcje, takie jak obsługa CLI, debugowanie wywołań AJAX i wiele innych.

Może szybko znajdować i poprawiać błędy, zrzucać zmienne, rejestrować błędy, wizualizować zużycie pamięci i określać czas wykonywania zapytań lub skryptów. Używanie kodowania kolorami i wyróżniania problemów na czerwono wraz z jasnymi wyjaśnieniami ułatwia wizualizację wyjątków i błędów oraz ich zrozumienie.

Tracy jest wyposażony w funkcję rejestrowania i automatyczne wykrywanie środowiska. Przechowuje dane w plikach dziennika i wyświetla komunikaty o błędach serwera odwiedzającemu podczas przestojów. Tracy może również integrować się z Drupal 7, OpenCart, WordPress i innymi.

vprof

vprof to wizualny profiler dla aplikacji Pythona. Dostarcza bogatych, interaktywnych wizualizacji różnych cech twojego programu w Pythonie, takich jak wykorzystanie pamięci i czas działania.

Jest dostępny na licencji BSD i obsługuje język Python 3.4 i nowsze.

Wniosek

Wydajność aplikacji jest kluczowym czynnikiem spełniającym oczekiwania użytkowników końcowych. A jeśli wystąpią problemy z wydajnością, musisz być gotowy do zdiagnozowania problemu, zanim wpłynie to na wrażenia użytkownika końcowego.

Dlatego optymalizuj swoje aplikacje i natychmiast rozwiązuj problemy, aby nadal zapewniać superszybką wydajność aplikacji użytkownikom za pomocą narzędzi, o których wspomniałem w tym artykule.

Oto krótka tabela porównawcza pokazująca powyższe profilery i to, do czego jest najczęściej używana.

Nazwa
Języki
py-szpieg
Pyton
Piroskop
Python, Ruby, Go
Bubbleprof
Node.js
Pyinstrument
Pyton
Xdebug
PHP
SPX
PHP
Prefiks
Python, .NET, Java, Node.js, Ruby, PHP
Różnoboczny
Pyton
VisualVM
Jawa
Profiler orbity
C, C++
Uber JVM Profiler
Jawa
Tracy
PHP
vprof
Pyton