Il debug dei problemi di prestazioni in produzione può essere un dolore e, in alcuni casi, impossibile senza gli strumenti giusti. La profilazione Java esiste da sempre, ma i profilatori java a cui la maggior parte degli sviluppatori pensa sono solo di un tipo: i profilatori JVM standard.
Tuttavia, usare un tipo di profilatore non è sufficiente.
Supponiamo che tu stia analizzando le prestazioni della tua applicazione. Ci sono più attività di profilazione che si possono eseguire. Generalmente, i profilatori standard gestiscono la profilazione della memoria, della CPU e dei thread.
Ma anche con tutta questa copertura, usando una combinazione di più profilatori, troverete più problemi di prestazioni. Questo perché ogni profiler è migliore in un certo aspetto per inseguire un bug di prestazioni.
In questo post, parleremo dei tre tipi di profiler Java e perché abbiamo bisogno di tutti loro durante lo sviluppo dell’applicazione. Inizieremo con i tipi e ci immergeremo in profondità in ognuno di essi.
Diamo un’occhiata ai tre diversi tipi di profilatori Java:
- Profilatori JVM standard che tracciano ogni dettaglio della JVM (CPU, thread, memoria, garbage collection, ecc.).
- Profilatori leggeri che evidenziano la vostra applicazione con un po’ di astrazione.
- Strumenti di Application Performance Management (APM) usati per monitorare le applicazioni in ambienti di produzione.
Profiler JVM standard
Prodotti come VisualVM, JProfiler, YourKit e Java Mission Control.
Un profiler Java standard fornisce certamente la maggior parte dei dati, ma non necessariamente le informazioni più utili. Questo dipende dal tipo di attività di debug.
I profilatori JVM tracceranno tutte le chiamate di metodo e l’uso della memoria. Questo permette ad uno sviluppatore di immergersi nella struttura delle chiamate in qualsiasi angolo scelga.
Pros:
- Grande per rintracciare le perdite di memoria, i profilatori standard dettagliano tutto l’uso della memoria da parte della JVM e quali classi/oggetti sono responsabili. La capacità di eseguire manualmente la garbage collection e poi rivedere il consumo di memoria può facilmente mettere in luce le classi e i processi che stanno trattenendo la memoria per errore.
- Bene per tracciare l’uso della CPU, un profiler Java di solito fornisce una funzione di campionamento della CPU per tracciare e aggregare il tempo della CPU per classe e metodo per aiutare a individuare i punti caldi.
Cons:
- Richiede una connessione diretta alla JVM monitorata; questo finisce per limitare l’uso agli ambienti di sviluppo nella maggior parte dei casi. (Nota: alcuni profiler possono lavorare su thread e memory dump in modo limitato.)
- Rallentano la tua applicazione; è richiesta una buona quantità di potenza di elaborazione per l’alto livello di dettaglio fornito.
Profiler di transazioni Java leggeri
Prodotti come XRebel e Stackify Prefix.
I profilatori leggeri hanno un approccio diverso nel tracciare la tua applicazione iniettando se stessi nel codice.
- I profilatori di aspetti usano la programmazione orientata agli aspetti (AOP) per iniettare codice all’inizio e alla fine di metodi specifici. Il codice iniettato può avviare un timer e poi riportare il tempo trascorso quando il metodo finisce. Questi profiler sono semplici da impostare, ma è necessario sapere cosa profilare. Per un esempio, vedere Spring AOP Method Profiling.
- I profilatori Java Agent usano l’API Java Instrumentation per iniettare codice nella vostra applicazione. Questo metodo ha un maggiore accesso alla vostra applicazione poiché il codice viene riscritto a livello di bytecode. Questo permette a qualsiasi codice in esecuzione nella vostra applicazione di essere strumentato, sia il codice che avete scritto o le librerie di terze parti da cui dipende la vostra applicazione. Date un’occhiata a questa introduzione a Java Agents per vedere come funziona il tutto.
I profilatori di aspetti sono abbastanza facili da impostare, ma sono limitati in ciò che possono monitorare e sono gravati dal dettagliare tutto ciò che volete che sia tracciato. Gli agenti Java hanno un grande vantaggio nella loro profondità di monitoraggio, ma sono molto più complicati da scrivere.
Stackify Prefix è un profilatore Java orientato allo sviluppatore che usa il metodo del profilatore Java Agent dietro le quinte.
La cosa bella è che Prefix conosce già le classi più desiderate e le librerie di terze parti che gli sviluppatori vogliono essere strumentate, quindi non è necessario dettagliarle tutte. Inoltre, prende tutte le statistiche dalla strumentazione e le visualizza in modo semplice e comprensibile.
Ad esempio, quando si esegue un’applicazione utilizzando Hibernate, Prefix non solo dettaglia il tempo trascorso per le query, ma visualizza anche i valori dei parametri per l’SQL generato. Quando la tua applicazione chiama un’API SOAP/REST, Prefix fornisce il contenuto della richiesta e della risposta.
Low Overhead, Java JVM Profiling in Production (APM)
Tutti i profiler finora sono stati ottimi per lo sviluppo, ma tracciare come il tuo sistema si comporta in produzione è fondamentale.
La produzione è sempre un paesaggio diverso: le configurazioni di sviluppo e di staging tipicamente non hanno gli stessi set di dati e lo stesso carico.
Gli strumenti Java APM usano tipicamente il metodo del profilatore Java Agent ma con diverse regole di strumentazione per permettere loro di funzionare senza influenzare le prestazioni nelle produzioni. Il trucco con questi profilatori è quello di fornire le giuste informazioni in modo intelligente per non occupare cicli di CPU.
Retrace di Stackify è uno strumento APM che utilizza la stessa tecnologia di Stackify Prefix con alcuni aggiustamenti per funzionare senza problemi in ambienti di staging e produzione.
Questo viene fatto aggregando le statistiche sui tempi e campionando le tracce. Questo vi dà visibilità a livello di metodo sul codice della vostra applicazione che è in esecuzione in produzione.
Quindi, quando avete una richiesta web lenta, questo si tradurrà in una traccia che appare in Retrace. Da lì puoi immergerti e vedere quali metodi sono i colpevoli.
Schermo di Retrace: Web Request Aggregation over 4 hours
Perché hai bisogno di tutti e 3 i profilatori per la tua applicazione?
I profilatori standard sono buoni per trovare problemi di performance nella fase di sviluppo. Ma la produzione è uno scenario diverso. Il comportamento della tua applicazione può cambiare in base al traffico in entrata, alla richiesta del server, alla risposta e a molte altre cose.
Quindi, qual è la soluzione per l’ambiente di produzione? Gli strumenti APM sono la risposta. Gli strumenti APM mirano all’ambiente di produzione e forniscono un rapporto sulle prestazioni della tua applicazione.
Quindi, i profilatori standard aiutano nello sviluppo e gli strumenti APM aiutano nella produzione. Vi starete chiedendo che bisogno c’è di profilatori di transazioni leggeri.
Bene, i profilatori leggeri seguono un approccio diverso alla profilazione del codice. Si iniettano direttamente nel codice, specialmente all’inizio e alla fine di un metodo.
Sono anche facili da impostare e consumano relativamente meno risorse. Questo è molto utile per le applicazioni che usano la memoria di transazione hardware. Queste applicazioni richiedono strumenti di analisi raffinati che indichino esattamente quale metodo o funzione sta causando problemi di prestazioni.
Indubbiamente, possiamo dire che se state sviluppando un’applicazione complessa, avrete bisogno di tutti e tre i profilatori. Ogni tipo di profilatore ha un approccio unico che controlla un’applicazione per i problemi di prestazioni.
Il sondaggio di RebelLab ha anche mostrato che la maggior parte delle aziende utilizza più profilatori di codice per trovare problemi di prestazioni nelle loro applicazioni.
Perché alcuni profilatori Java sono così costosi?
XRebel è uno strumento interessante, ma costa 365 dollari l’anno. Stackify Prefix è gratuito e fornisce molte delle stesse funzionalità.
Il più grande problema con le soluzioni APM è sicuramente il loro prezzo. Sono state tradizionalmente così costose che solo le più grandi imprese potevano permettersele.
Non ha molto senso spendere circa 100 dollari al mese per un server su Azure o AWS e poi spendere quasi 200 dollari al mese per un prodotto come New Relic.
Gli strumenti di monitoraggio non dovrebbero costare più dei server! APM Pricing Is Now Affordable for All Developers, and Why They Should Care
Wrapping It Up
Ora che hai imparato a conoscere i tre tipi di profilatori di codice Java, è il momento di decidere se hai davvero bisogno di tutti loro.
La risposta sta nella natura della tua applicazione.
Se è piccola come un business locale o il sistema di gestione delle spese del negozio, il profiling è molto semplice. Un profilatore standard farà il lavoro.
Se state sviluppando un’applicazione web come il sistema di tracciamento di un corriere, la vostra applicazione potrebbe essere consultata da migliaia di utenti. In questo caso, avrete anche bisogno di strumenti APM per l’ambiente di produzione.
Infine, se la vostra applicazione è per sistemi embedded, avrete bisogno di tutti e tre.
Scegliete bene, e divertitevi a sviluppare un’applicazione che offra prestazioni ottimali.