martedì 4 marzo 2014

Un open source JVM campionamento Profiler

La zona di Performance è supportato da New Relic e AppDynamics . Entrambi sono leader nello spazio APM con clienti di alto profilo e di riduzione dei costi enormi per tali utenti.
E 'una carenza noto della maggior parte dei profiler di campionamento Java esistenti che la loro collezione di stack deve avvenire in un punto sicuro. Questo è il caso per profilers come il profiler di campionamento, che utilizza l'agente di gestione SUN / Oracle per raccogliere le sue tracce dello stack. Il problema di questo approccio è che esso introduce sia un bias campione dato che non tutti i punti del programma è un safepoint e anche che introduce un overhead di quanto tempo ci vuole la JVM per raggiungere un safepoint.
Qualche tempo fa Jeremy Manson open source qualche codice di prova in cui le chiamate sono fatte per il metodo AsyncGetCallTrace JVMPI che evita la necessità di discussioni per raggiungere un punto sicuro per leggere la loro traccia chiamata. Sotto il cofano di questo codice registra una funzione del gestore che viene chiamato quando si verifica un SIGPROF. Di conseguenza, evita una serie di problemi di precisione profiler che gli altri profiler di campionamento soffrono. Lo svantaggio di questo metodo è che il codice nel tuo callback asincroni ha restrizioni orribili su di esso, ad esempio, l'impossibilità di allocare la memoria heap. Il codice di prova ha mostrato qualche grande ingenuità, ma, essendo un proof of concept, mancava di funzioni utili come un'interfaccia utente o il supporto per la visualizzazione dei dati di profilatura essere aggiornati come il programma era in esecuzione.
Ho preso questa discarica codice e ha iniziato la conversione in un progetto open source utilizzabile. Il programma ha due componenti principali. C'è un piccolo + + agente JVMTI C che scrive un file di log che descrive un profilo della domanda è stato allegato al. Poi un'applicazione Java 8 può rendere / visualizzare un profilo basato su questo registro. Il codice di lettura e scrittura si basa su file mappati in memoria, quindi se si dovesse spostare il file di registro in un file system tmpfs sarebbe anche funzionare come un sistema IPC memoria condivisa. Ho anche aggiunto una GUI, non un grande - ma è un inizio.
Generazione di un file di log significa che il profilo può essere analizzato non in linea o retrospettivamente. Per esempio è possibile scaricare i file di log run di test delle prestazioni e poi guardare le differenze storiche se hai notato una regressione nella produzione. Questo profiler aggira le severe restrizioni su ciò che può essere fatto in callback asincroni copiando la traccia dello stack corrente in un non-blocking, produttore multipla, singola coda circolare dei consumatori, che alloca un blocco di dimensione fissa di memoria fino davanti. Queste tracce dello stack vengono poi lette da un altro thread che scrive il file di log. L'altro thread deve anche cercare informazioni su cose utili come nomi di metodo perché il JVMTI chiama per cercare informazioni sul nome del metodo non sono Async sicuro.
Al momento questo codebase non è pronto per la produzione - ci sono un sacco di bug e un sacco di C / C + + codice che non ho completa fiducia trovi Tenete a mente che se c'è un errore nel agente JVMTI allora potrebbe segmentation fault JVM. Siete stati avvertiti! Il codice sorgente è su GitHub ed è concesso in licenza Apache. Gradirei entrambi collaboratori di codici e inoltre tutte le risposte che le persone hanno. Le cose sono in una fase molto presto al momento, ma io sono un grande credente che avere il codice all'aria aperta aiuta rapidamente a migliorare la sua qualità.

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.