Odstraňování problémů s výkonem ve výrobě může být bez správných nástrojů nepříjemné a v některých případech nemožné. Profilování Javy existuje odjakživa, ale profilery Javy, na které většina vývojářů myslí, jsou pouze jednoho typu: standardní profilery JVM.
Používání jednoho typu profileru však nestačí.
Předpokládejme, že analyzujete výkon své aplikace. Existuje více profilovacích činností, které můžete provádět. Obecně platí, že standardní profilery zvládají profilování paměti, profilování procesoru a profilování vláken.
Ale i s tímto pokrytím, při použití kombinace více profilerů najdete více problémů s výkonem. Je to proto, že každý profiler je v určitém aspektu lepší pro vyhledání výkonnostní chyby.
V tomto příspěvku se budeme zabývat třemi typy profilerů Javy a důvody, proč při vývoji aplikace potřebujeme všechny. Začneme typy a ponoříme se do hloubky každého z nich.
Podíváme se na tři různé druhy profilerů Javy:
- Standardní profilery JVM, které sledují každý detail JVM (CPU, vlákna, paměť, garbage collection atd.).
- Lehké profilery, které zvýrazňují vaši aplikaci s trochou abstrakce.
- Nástroje pro správu výkonu aplikací (APM) používané pro sledování aplikací v živém provozu v produkčním prostředí.
Standardní profilery JVM
Produkty jako VisualVM, JProfiler, YourKit a Java Mission Control.
Standardní profiler Javy jistě poskytuje nejvíce dat, ale ne nutně nejužitečnější informace. To závisí na typu úlohy ladění.
Profilovače JavaVM budou sledovat všechna volání metod a využití paměti. To umožňuje vývojáři ponořit se do struktury volání z libovolného úhlu pohledu.
Pros:
- Skvělé pro sledování úniků paměti, standardní profilery podrobně popisují veškeré využití paměti JVM a které třídy/objekty jsou za to zodpovědné. Možnost ručně spustit garbage collection a poté zkontrolovat spotřebu paměti může snadno posvítit na třídy a procesy, které drží paměť omylem.
- Dobré pro sledování využití procesoru, profiler Javy obvykle poskytuje funkci vzorkování procesoru, která sleduje a agreguje čas procesoru podle tříd a metod, aby pomohla vynulovat horká místa.
Nevýhody:
- Vyžaduje přímé připojení ke sledovanému JVM; to ve většině případů končí omezením použití na vývojová prostředí. (Poznámka: některé profilery mohou v omezené míře pracovat s výpisy vláken a paměti.)
- Zpomalují aplikaci; pro vysokou úroveň poskytovaných detailů je zapotřebí značný výpočetní výkon.
Lehké Java Transaction Profilers
Produkty jako XRebel a Stackify Prefix.
Lehké profilery přistupují ke sledování aplikace jinak – injektují se přímo do kódu.
- Aspect Profilery využívají aspektově orientované programování (AOP) a injektují kód na začátek a konec určených metod. Injektovaný kód může spustit časovač a po ukončení metody pak ohlásit uplynulý čas. Tyto profilovače se snadno nastavují, ale musíte vědět, co chcete profilovat. Příklad najdete v části Profilování metod Spring AOP.
- Profilovače Java Agent používají rozhraní Java Instrumentation API k injektování kódu do vaší aplikace. Tato metoda má větší přístup k vaší aplikaci, protože kód je přepisován na úrovni bajtkódu. To umožňuje instrumentovat jakýkoli kód běžící ve vaší aplikaci – ať už jde o kód, který jste napsali, nebo o knihovny třetích stran, na kterých vaše aplikace závisí. Podívejte se na tento úvod do agentů Javy, kde se dozvíte, jak to všechno funguje.
Profilovače Aspect se nastavují poměrně snadno, ale jsou omezené v tom, co mohou sledovat, a jsou zatížené podrobným popisem všeho, co chcete, aby bylo sledováno. Java Agenti mají velkou výhodu v hloubce sledování, ale jsou mnohem složitější na psaní.
Stackify Prefix je profiler Javy orientovaný na vývojáře, který v zákulisí používá metodu profileru Java Agent.
Zajímavé je, že Prefix již zná nejžádanější třídy a knihovny třetích stran, které chtějí vývojáři instrumentovat – takže je nemusíte všechny podrobně popisovat. Navíc přebírá všechny statistiky z instrumentace a zobrazuje je jednoduchým a srozumitelným způsobem.
Příklad při spuštění aplikace pomocí Hibernate Prefix nejen podrobně popíše uplynulý čas dotazů, ale také zobrazí hodnoty parametrů generovaného SQL. Když vaše aplikace volá rozhraní SOAP/REST API, Prefix poskytne obsah požadavků a odpovědí.
Nízká režie, profilování Java JVM ve výrobě (APM)
Všechny dosavadní profilery byly skvělé pro vývoj, ale sledování výkonu systému ve výrobě je velmi důležité.
Produkce je vždy jiné prostředí – vývojová a stagingová nastavení obvykle nemají stejné datové sady a zátěž.
Přístroje Java APM obvykle používají metodu profileru Java Agent, ale s jinými pravidly instrumentace, aby mohly běžet bez ovlivnění výkonu v produkci. Trik s těmito profilery spočívá v poskytování správných informací chytrým způsobem, aby nezabíraly cykly procesoru.
Stackify Retrace je nástroj APM, který používá stejnou technologii jako Stackify Prefix s několika úpravami pro hladký běh ve stagingových a produkčních prostředích.
To se provádí agregací statistik časování a vzorkováním stop. Tím získáte přehled na úrovni metod o kódu vaší aplikace, která běží v produkčním prostředí.
Pokud tedy máte pomalý webový požadavek, promítne se to do stopy, která se zobrazí v Retrace. Odtud se můžete ponořit dovnitř a zjistit, které metody jsou viníkem.
Snímek obrazovky Retrace: Agregace webových požadavků za 4 hodiny