2009-09-08 8 views
8

La nostra applicazione ha ~ 10 thread che svolgono attività separate (nessun pool di thread). Non stiamo riscontrando un deadlock, ma stiamo sempre cercando di ridurre la latenza per rispondere a una richiesta, quindi siamo interessati a determinare quali lock sono i più contesi. jconsole mostra quante volte i thread sono bloccati, e non è molto spesso, ma vogliamo ancora sapere quali sono i lock più contesi.Determinare quali blocchi sono maggiormente contesi?

Stiamo usando la JVM Sun, quindi JLA da IBM non è utile e non stiamo girando su Solaris, quindi non possiamo usare dTrace.

MODIFICA: desidero eseguire questa osservazione in produzione, in cui un profiler rallenterebbe l'app in modo inaccettabile. Questo è un sistema di trading, se siamo lenti, perdiamo denaro, quindi non eseguiamo profiler nella produzione. È anche abbastanza difficile simulare i numerosi scambi a cui parliamo in un test delle prestazioni.

+0

dTrace è l'unico sistema di cui sono personalmente a conoscenza che fa ciò che vuoi senza strumenti di profilazione. – aperkins

+0

Pensandoci meglio, ritengo che la strumentazione sia l'approccio migliore. È possibile registrare le singole richieste di blocco o mantenere i contatori globali. –

risposta

7

Ottieni un buon profiler come YourKit. Può dirvi quanto tempo è trascorso in attesa e blocco su particolari metodi e monitor di oggetti in esso contenuti. Per esempio:

alt text http://i25.tinypic.com/j8ocbm.jpg


In merito al suo commento su metriche di produzione, il gioco è abbastanza limitato in quello che è possibile raccogliere. La maggior parte delle informazioni che otterrete è dal numero ThreadMXBean che può fornire metadati su tutti i thread in esecuzione. Tuttavia, non ti darà informazioni sulla contesa di un monitor oggetto specifico.

Non voglio salire sulla mia torre d'avorio ma sento che la soluzione migliore è provare a replicare il tuo ambiente di produzione il più vicino possibile. Passare un po 'di tempo a ottenere il set up ora pagherà dividendi molte volte in futuro.

Anche l'esecuzione di un profiler con un ambiente simulato ma non abbastanza buono probabilmente ti darà buone informazioni.

+0

JProfiler ha funzionalità simili. Ma voglio fare questa osservazione in produzione, dove un profiler potrebbe rallentare l'app in modo inaccettabile. Questo è un sistema di trading, se siamo lenti, perdiamo denaro, quindi non eseguiamo i profiler nella produzione. È anche abbastanza difficile simulare i numerosi scambi con cui si parla in un ambiente di test delle prestazioni. –

+0

@Ted, modificherei la tua domanda per aggiungere quell'informazione che modifica in modo drammatico ciò che puoi e non puoi fare. – Kevin

+0

Grazie Kevin, modificato. Abbiamo un ambiente di test delle prestazioni che è stato molto utile in passato, ma penso che molti negozi di finanza ad alta frequenza abbiano deciso che passare troppo tempo a simulare il mondo reale non è produttivo. Cercherò uno scambio in cui possiamo eseguire un profiler in produzione senza troppi danni. –

4

Per un problema simile nel database, registriamo una riga appena prima della richiesta e immediatamente dopo l'acquisizione di un blocco. Registriamo anche uno dopo il rilascio. Successivamente, elaboriamo questi dati per generare il tipo di statistiche che stai cercando.

MODIFICA: in cima a un sistema sviluppato, AspectJ potrebbe essere una buona opzione per generare i registri.

5

Ted, sono solidale con la tua situazione, ma quando le prestazioni sono così importanti, ti consiglio di mordere il proiettile e simulare.

Non dovrebbe essere così difficile come temete: invece di provare a generare il flusso di messaggi dai vostri scambi, perché non registrare il flusso in entrata e riprodurlo nuovamente sulla simulazione?

Senza qualcosa del genere, ti imbatterai sempre nel problema di Heisenberg: interessando il sistema che stai misurando.

Problemi correlati