2011-01-14 20 views
6

Ho un'applicazione web java in esecuzione su un server Tomcat (Linux). Nell'ambiente di produzione sto affrontando un problema di prestazioni. A intervalli casuali il processo jsvc su cui è in esecuzione tomcat inizia a funzionare al 90-100% della CPU. Non riesco a scoprire il trigger per questo evento. Il server è un sistema quad-core. Il consumo di memoria non indica alcuna anomalia.Strumenti per monitorare l'esecuzione del thread java

Come posso controllare quale thread (traccia stack di applicazioni) nell'applicazione sta causando il problema?

Sto verificando con jconsole e PSI Probe, ma entrambi non forniscono informazioni dettagliate su quale thread all'interno dell'applicazione sta causando l'anomalia di utilizzo della CPU.

+0

Che cosa è con il tag '' [javascript prestazioni]? – skaffman

+0

@skaffman, Scusa java-performance, l'ho corretto. –

+0

Stavamo riscontrando alcuni problemi di prestazioni anche con i nostri server di produzione e dal momento che il collegamento di un profiler a un server di produzione è complicato. Abbiamo provato NewRelic. È uno strumento straordinario da aggiungere per le tue indagini sulle prestazioni. – eSniff

risposta

5

Un relativamente facile modo per fare questo (che può o non può funzionare per il vostro caso - dipende da quanto tempo si verifica il comportamento):

Quando la tua applicazione presenta il comportamento che si desidera eseguire il debug (in questo caso , 90-100% utilizzo CPU) usa jstack sull'ID processo:

http://download.oracle.com/javase/6/docs/technotes/tools/share/jstack.html

esaminare quali fili sono in esecuzione e in quali metodi si verificano. Se lo fai alcune volte, potrebbe essere relativamente facile individuare la catena di chiamata colpevole. È quindi possibile eseguire il debug dell'ingresso a quella catena.

Non è necessariamente il metodo migliore o più elegante, ma è molto facile da fare e potrebbe essere tutto ciò che serve. Vorrei iniziare da lì. È simile alla filosofia "printf è il miglior debugger che abbia mai usato".

+3

Vorrei anche aggiungere che un profilatore come JProfiler probabilmente ti darà più metriche su quali thread stanno facendo cosa, ma inseguirlo potrebbe richiedere molto tempo se il problema è relativamente semplice. Quindi vorrei sottolineare che è necessaria un'analisi rapida basata su jstack di alcuni esempi prima di attivare i profiler appropriati. – kvista

+0

Vista grazie per la risposta. Ho intenzione di provare jstack. –

2

È possibile ottenere un dump di stacktrace per tutti i thread in qualsiasi applicazione Java inviando un segnale QUIT.

kill -QUIT [processId] 

Questo verrà visualizzato nel processo 'stdout.

1

Solo i miei 2 cent, ma mi chiedo se non si sta sperimentando un problema di memoria i picchi della CPU potrebbe essere l'attività GC. Quindi mentre stai monitorando il tuo tomcat con jconsole dai un'occhiata alla scheda della memoria e controlla se l'utilizzo dell'heap non sta andando troppo in alto.

2

Un altro strumento per mostrare le prime discussioni cpu-consumo è jvmtop

Problemi correlati