Cílem vaší aplikace je poskytnout co nejlepší zážitek koncovým uživatelům.
Kromě nezbytných funkcí, je klíčové, aby byla rychlá, responzivní, intuitivní a stabilní.
Nicméně, udržovat software v perfektní kondici, aby neustále dosahoval špičkového výkonu, není jednoduché.
Když váš kód začne zbytečně volat funkce, sám se o sebe zakopává, objevují se v něm chyby a dostává se do nekonečných smyček, může to vést k neefektivnosti. Důsledkem může být pomalá aplikace, která nereaguje, nebo se chová nečekaně.
Pokud tyto problémy nebudete řešit, celkový výkon aplikace klesne.
To může vaše uživatele frustrovat, nebo je dokonce odradí od používání vaší aplikace z důvodu nízké rychlosti a nedostatečné odezvy. Nejenže to poškozuje vaši reputaci, ale má to i negativní dopad na vaše příjmy a zisky. Proto je důležité váš kód analyzovat, testovat a ladit, abyste zajistili optimální výkon. Rychlým řešením je použití nástroje pro softwarové profilování, který vám umožní sledovat a ladit kód, abyste se zbavili úzkých míst, která ovlivňují výkon.
V tomto článku se seznámíte se softwarovým profilováním a zjistíte, jak vám může pomoci. Ukážu vám také některé z nejlepších nástrojů pro profilování, které vám pomohou s laděním a optimalizací vaší aplikace.
Co je softwarové profilování?
Softwarové profilování je dynamická analýza kódu, která sleduje chování programu pomocí dat shromážděných během jeho běhu. Hlavním cílem je identifikovat části kódu, které je třeba optimalizovat, abyste zlepšili rychlost aplikace, její odezvu a snížili spotřebu paměti a dalších systémových prostředků.
Softwarový profiler běžně měří dobu trvání a četnost volání funkcí, stejně jako nároky na paměť nebo časovou složitost programu. Existují i specializované profilery, například ty, které se zaměřují na analýzu využití paměti.
Profilování se obvykle provádí instrumentací zdrojového kódu. Profilery mohou používat různé techniky profilování, například instrumentované, událostmi řízené, statistické nebo simulační metody.
Proč je softwarové profilování důležité?
Softwarové profilování je klíčové pro zjištění, jak program využívá systémové zdroje a jak dlouho trvá provádění konkrétních funkcí. Pomáhá optimalizovat rychlost programu a současně zajišťuje, aby využíval minimum zdrojů.
Provádí se také za účelem sledování a optimalizace využití procesoru a času potřebného pro provádění jednotlivých instrukcí.
Volba správného nástroje pro profilování softwaru je nezbytná, abyste dokázali rychleji odhalit problémy s výkonem, zlepšili efektivitu vaší aplikace a poskytovali lepší zážitek koncovým uživatelům. Mnoho profilerů nabízí detailní reporty a interaktivní grafy, které vám pomohou odhalit přesnou příčinu problémů a usnadní jejich řešení.
Níže je uveden seznam několika vynikajících softwarových profilerů, které můžete vyzkoušet. Dejte nám vědět, který z nich se vám osvědčil nejvíce.
py-spy
py-spy je vynikající profilovač pro Python, který pracuje na principu vzorkování. Umožňuje vám detailně prozkoumat, jak vaše aplikace v Pythonu tráví čas.
Pro jeho použití nemusíte upravovat kód ani restartovat program. py-spy má nízkou režii a je napsán v jazyce Rust, díky čemuž je velmi rychlý. Není navržen tak, aby běžel ve stejném procesu jako profilovaný program v Pythonu. To znamená, že py-spy je bezpečný a můžete ho bez obav použít i proti produkčnímu kódu.
Tento nástroj umožňuje zaznamenávat profily, generovat takzvané „flame graphs“ (plamenové grafy) a vytvářet interaktivní SVG soubory. Můžete si také nastavit různé možnosti, například frekvenci vzorkování, profilovat nativní rozšíření C, sledovat podprocesy, ID vláken a další. Pomocí příkazu ‚top‘ získáte živý přehled o funkcích, které právě běží, a pomocí příkazu ‚dump‘ si můžete prohlédnout aktuální zásobník volání pro každé vlákno.
py-spy podporuje všechny verze interpretu CPython od 2.3 – 2.7 až po 3.3 – 3.8. Můžete jej nainstalovat z PyPI nebo GitHub.
Pyroscope
Otevřený software pro kontinuální profilování, Pyroscope, vám pomůže odladit problémy s výkonem vaší aplikace během několika minut.
Můžete spustit server, a následně i agenta, bez ohledu na to, zda používáte Docker, Linux nebo hledáte podporu pro Ruby nebo Go. Pyroscope vám poskytne vše, co potřebujete. Nezáleží na tom, jestli chcete profilovat data za deset sekund, nebo deset měsíců, jejich vlastní úložný modul se postará o rychlé dotazy.
Nemusíte se starat o režii nebo vliv na výkon aplikace, protože používají technologii vzorkování, která výkon neovlivňuje. Pyroscope efektivně ukládá vaše profilovací data a je tak nákladově efektivní, i když chcete dlouhodobě ukládat data z mnoha různých aplikací.
Pyroscope funguje na macOS, Linuxu a Dockeru a podporuje programy napsané v jazycích Python, Go a Ruby.
Bubbleprof
Bubbleprof od Clinic.js představuje nový a unikátní způsob, jak profilovat software napsaný v Node.js. Využívá „bublinkové“ uživatelské rozhraní, které umožňuje i začátečníkům snadno identifikovat asynchronní operace a čas, který v nich aplikace tráví.
Vizualizuje, jak fungují vaše procesy Node.js. Sleduje asynchronní operace, seskupuje je, počítá zpoždění a zobrazuje je graficky.
Bubbleprof určuje časování operací na základě velikosti bublin, které reprezentují kód, jádro Node.js nebo modul. Navíc spojuje sousední skupiny, aby byl graf přehlednější.
Aby se spočítala zpoždění, měří Bubbleprof délku šipek, které spojují jednotlivé bubliny. Pro měření používá různé barvy. Vnitřní barevné čáry pak indikují, jaký typ asynchronní operace způsobuje zpoždění.
Pyinstrument
Optimalizujte svůj Python kód s pomocí Pyinstrument.
Ukáže vám, proč je váš Python kód pomalý a pomůže vám diagnostikovat problémy, abyste dosáhli špičkového výkonu.
Pro použití Pyinstrument nemusíte psát žádný speciální kód. Stačí jej spustit přímo z příkazové řádky. Váš skript poběží normálně a Pyinstrument vám ukáže barevný přehled částí, ve kterých aplikace trávila nejvíce času. Nabízí také Python API, které celý proces ještě více zjednodušuje.
Můžete také profilovat webové požadavky ve frameworkách Flask a Django. Pro oba tyto frameworky existuje podrobná dokumentace. Mějte na paměti, že Pyinstrument provádí statistické profilování, které zaznamenává zásobník volání každou 1 ms místo toho, aby sledoval každé volání funkce.
Je to výhodné, protože statistické profilování má nižší režii ve srovnání s profilováním, které sleduje každé volání. Vzhledem k tomu, že zaznamenává celý zásobník volání, je snadné najít problematické funkce. Navíc Pyinstrument skrývá (ve výchozím nastavení) rámce knihoven, což vám umožňuje zaměřit se na části kódu, které přímo ovlivňují výkon.
Ladění problémů s výkonem je jednodušší, protože Pyinstrument zaznamenává čas strávený v reálném čase. Nástroj sleduje veškerý čas programu strávený čtením souborů, stahováním dat, komunikací s databází atd.
Xdebug
Chcete-li zlepšit výkon kódu a zefektivnit vývoj, Xdebug vám nabízí širokou škálu možností pro profilování a ladění kódu.
Je to rozšíření PHP, které vám umožní najít úzká místa ve vaší PHP aplikaci a analyzovat její výkon pomocí externích nástrojů pro vizualizaci. Tyto nástroje vám umožní generovat grafy a podrobné reporty o výkonu aplikace.
Xdebug generuje detailní výstup, který ukazuje, jak aplikace dospěla k chybě, včetně parametrů, které předala dané funkci. To se používá pro sledování chyb. Pro lepší srozumitelnost jsou informace barevně odlišeny a strukturovány.
Xdebug také nabízí vzdálený debugger, který můžete použít k propojení s běžícím kódem, IDE nebo prohlížečem. Můžete tak nastavovat zarážky a spouštět kód řádek po řádku. Další funkcí je pokrytí kódu, které vám ukáže, jak velká část vašeho kódu byla spuštěna. To je užitečné při psaní unit testů.
SPX
Simple Profiling eXtension (SPX) je profilovací rozšíření navržené pro PHP. Má některé unikátní vlastnosti, které jej odlišují od ostatních profilovacích nástrojů. Jeho použití je zcela ZDARMA a je omezeno pouze na vaši infrastrukturu. To znamená, že se nemusíte bát o únik dat.
Jednoduchost SPX zaručuje snadné použití. Stačí nastavit příkazový řádek nebo proměnnou prostředí pro profilování skriptu. Nebo můžete jednoduše zapnout přepínač na webové stránce, kterou chcete profilovat. Není tedy nutné upravovat kód ručně.
SPX také podporuje ukončení spuštěného skriptu z příkazové řádky pomocí Ctrl-C. Odpadá tak potřeba použití spouštěče z příkazové řádky nebo speciálního rozšíření prohlížeče. SPX podporuje více než 20 metrik, včetně různých časových a paměťových metrik, objektů, používaných souborů, vstupů a výstupů (I/O) a dalších.
Může shromažďovat data, aniž by opustil kontext. Jeho webové uživatelské rozhraní umožňuje konfigurovat a zapnout profilování pro aktuální relaci prohlížeče a zobrazuje detailní zprávy profilovaného skriptu. V tomto webovém rozhraní si můžete vybrat konkrétní report pro hlubší analýzu. Obsahuje také interaktivní vizualizace, jako je Flamegraph, plochý profil a časová osa, které lze škálovat na miliony volání funkcí.
Prefix
Prefix od Stackify je snadno instalovatelný a lehký profilovač kódu, který si oblíbilo mnoho vývojářů. Pomáhá vám odstraňovat úzká místa v aplikaci, optimalizovat ji a zlepšit uživatelskou zkušenost.
Prefix nabízí vynikající možnosti trasování a profilování. Umožňuje vám rychle najít skryté výjimky, pomalé SQL dotazy a další problémy. Dává vašim vývojářům sílu APM (monitorování výkonu aplikací). Prefix sleduje výkon kódu tak, jak ho píšete, a pomáhá vám psát efektivnější kód.
Díky tomu dostáváte méně požadavků na podporu od produkčního týmu a pomáhá vývojářům dosahovat cílů rychleji. Můžete odhalit pomalé dotazy, neznámá úzká místa a dotazy generované ORM.
Můžete také sledovat každý parametr volání SQL, zjistit časování a zobrazit ovlivněné záznamy. Prefix usnadňuje rozpoznání N+1 vzorů. Zapomeňte na procházení chaotických logů. Prefix je seskupí, abyste snadno našli problémy.
Prefix vám umožňuje přímo najít kontext podezřelého logu v dotazu a snadno přejít z logu na trasování pro snazší ladění. Prefix vám odhalí problémové závislosti. To je užitečné pro hledání skrytých výjimek a práci se staršími částmi kódu nebo frameworku. Mezi tyto závislosti mohou patřit webové služby, služby třetích stran, mezipaměť a další.
Prefix funguje na Windows i Mac a podporuje .Net, Ruby, Java, PHP, Python a Node.js.
Scalene
Scalene je vysoce přesný a výkonný profiler pro GPU, CPU a paměť. Je určen pro programy v Pythonu. Ve srovnání s jinými profilerů nabízí několik výhod, jako je rychlejší zpracování a poskytování podrobnějších informací.
Scalene je neuvěřitelně rychlý a používá spíše vzorkování než instrumentaci. Nespoléhá se ani na sledovací zařízení Pythonu. Jeho režie je obvykle pod 10-20 %. Tento nástroj provádí softwarové profilování na úrovni jednotlivých řádků kódu a ukazuje, které řádky jsou odpovědné za většinu doby provádění programu.
Tyto informace jsou mnohem cennější než informace z profilování na úrovni funkcí. Scalene odděluje čas strávený v čistém kódu Pythonu od času stráveného v nativním kódu (včetně knihoven). Protože většina vývojářů Pythonu nebude optimalizovat výkon nativního kódu, mohou se soustředit na optimalizaci kódu, který skutečně mohou zlepšit.
Scalene zvýrazňuje problematická místa červeně. Díky tomu snadno zjistíte, kde program tráví nejvíce času (CPU/paměť) a dokážete oddělit čas strávený v systému (například I/O operace). Scalene dokáže sledovat využití GPU, profilovat využití paměti a sledovat zatížení CPU. Scalene také dokáže identifikovat potenciální úniky paměti, objem kopírování profilů a generovat detailní profily pro řádky kódu, které spotřebovávají více než 1 % CPU.
VisualVM
Všestranný nástroj pro řešení problémů s Javou, VisualVM, je navržen pro použití ve výrobě i při vývoji. Jedná se o vizuální software, který integruje lehké funkce profilování a nástroje příkazové řádky JDK.
VisualVM monitoruje a řeší problémy s aplikacemi běžícími na Javě 1.4+. Využívá k tomu několik technologií, jako je JMX, jvmstat, Attach API a Serviceability Agent. Tento nástroj je vhodný pro inženýry kvality, systémové administrátory i koncové uživatele.
VisualVM automaticky detekuje vzdáleně i lokálně spuštěné aplikace založené na Javě a vypisuje je. Umožňuje vám také definovat programy ručně pomocí připojení JMX. Pro každý proces zobrazuje základní informace o běhu, jako je PID, předané argumenty, domovská stránka JDK, hlavní třída, parametry JVM, verze JVM a systémové vlastnosti.
VisualVM monitoruje využití procesoru, paměti (heap, metaspace) a paměti trvalé generace. Dále také sleduje vlákna a načtené třídy v aplikaci. Zobrazuje všechna běžící vlákna na časové ose, včetně doby spánku, běhu, parkování, sledování a čekání.
VisualVM umožňuje instrumentované i vzorkované profilování pro správu paměti a výkonu aplikací. Zobrazuje výpisy vláken a poskytuje rychlý přehled o procesech. Na vyžádání také zobrazuje a vytváří snímky .hprof, které vám pomohou odhalit neefektivní využití haldy a ladit úniky paměti.
VisualVM dokáže také načíst základní data o havarovaném procesu v Javě, včetně jeho prostředí. Aplikaci můžete analyzovat i offline. Můžete uložit běhové prostředí a konfiguraci aplikace s pořízenými výpisy haldy, vláken a profily. Ty pak můžete analyzovat i později.
Funguje na Windows, Linux i Unix.
Orbit Profiler
Vizualizujte své aplikace v C/C++ a rychle odhalte problémy s výkonem pomocí Orbit Profiler. Jedná se o ladicí nástroj a samostatný profiler, jehož cílem je pomoci vývojářům vizualizovat a porozumět složitému průběhu provádění aplikace.
Dává vám detailní vhled do toho, co se děje uvnitř aplikace. Díky tomu dokážete rychle odstranit překážky ve výkonu a zajistit vysokou rychlost aplikace.
Orbit Profiler dokáže efektivně pracovat s jakoukoliv C nebo C++ aplikací, pokud má přístup k souboru PDB. Jakmile stáhnete program, začne profilování. Orbit Profiler se připojí k cílovému procesu, k vybraným funkcím a spustí profilování.
Může dokonce pracovat i s vašimi optimalizovanými konečnými sestaveními. Kromě dynamické instrumentace nabízí Orbit Profiler i „vždy zapnuté“ možnosti vzorkování, které jsou rychlé, neustále dostupné a robustní.
Funguje na Windows i Linuxu.
Uber JVM Profiler
S pokročilými možnostmi profilování je Uber JVM Profiler další dobrou volbou pro aplikace založené na Javě.
Nabízí Java Agenta, který shromažďuje trasování zásobníku a metriky pro procesy Spark/Hadoop JVM distribuovaným způsobem. Například metriky paměti/CPU/IO.
Tento nástroj dokáže sledovat java argumenty a metody v uživatelském kódu, aniž by ho musel měnit. Můžete ho použít i pro sledování latence volání názvových uzlů HDFS pro všechny Spark aplikace a pro nalezení problémů. Dokáže také sledovat cesty k souborům HDFS aplikací Spark, aby odhalil horká místa a provedl další optimalizaci.
Uber JVM Profiler byl původně vytvořen pro profilování Spark aplikací, které obecně zahrnují mnoho strojů nebo procesů v jedné aplikaci. Můžete tak snadno porovnávat metriky pro různé stroje nebo procesy.
Nicméně, tento nástroj funguje jako běžný Java Agent a můžete ho použít pro jakýkoliv JVM proces. Mezi jeho vlastnosti patří:
- Ladění využití paměti aplikacemi Spark, včetně haldy Javy, nativní paměti, paměti mimo haldu, vyrovnávacích pamětí a paměťových fondů.
- Ladění využití CPU a doby garbage collection.
- Ladění metod tříd Java z hlediska četnosti volání, času a profilování doby trvání.
- Profilování argumentů (sledování volání metod a jejich argumentů).
- Profilování zásobníku a generování plamenových grafů pro čas CPU.
- Ladění I/O metrik a metrik vláken JVM.
Tracy
Tracy je užitečný nástroj, který pomáhá vývojářům snadno ladit PHP programy. Má příjemný design a pokročilé funkce, jako je podpora CLI, ladění hovorů AJAX a další.
Umožňuje rychle najít a opravit chyby, vypsat proměnné, protokolovat chyby, vizualizovat využití paměti a určit dobu provádění dotazů nebo skriptů. Používá barevné kódování a zvýrazňuje problémy červenou barvou. Získáte tak jasné vysvětlení chyb, a snadno tak pochopíte výjimky a chyby.
Tracy nabízí funkci protokolování a automatickou detekci prostředí. Ukládá data do souborů protokolu a zobrazuje návštěvníkům chybové zprávy serveru. Tracy lze integrovat s Drupal 7, OpenCart, WordPress a dalšími systémy.
vprof
vprof je vizuální profiler pro aplikace v Pythonu. Nabízí bohaté, interaktivní vizualizace pro různé charakteristiky vašeho Python programu, například využití paměti a dobu běhu.
Je dostupný pod licencí BSD a podporuje Python 3.4 a vyšší.
Závěr
Výkon aplikací je klíčovým faktorem pro splnění očekávání koncových uživatelů. Pokud se vyskytnou problémy s výkonem, musíte být připraveni problém diagnostikovat, než ovlivníte uživatelskou zkušenost.
Proto neustále optimalizujte své aplikace, okamžitě opravujte problémy a používejte nástroje, které jsem v tomto článku zmínil. Zajišťujte tak vašim uživatelům rychlý a bezproblémový chod aplikací.
Níže je rychlá srovnávací tabulka, která ukazuje přehled zmíněných profilerů a jejich typické použití:
Název | Jazyky |
py-spy | Python |
Pyroscope | Python, Ruby, Go |
Bubbleprof | Node.js |
Pyinstrument | Python |
Xdebug | PHP |
SPX | PHP |
Prefix | Python, .NET, Java, Node.js, Ruby, PHP |
Scalene | Python |
VisualVM | Java |
Orbit Profiler | C, C++ |
Uber JVM Profiler | Java |
Tracy | PHP |
vprof | Python |