2011-08-23 26 views
13

Come ho postato in Performance drop after 5 days running web application, how to spot the bottleneck?, ho un problema con un'applicazione che diventa lenta dopo l'esecuzione per un po '.Come utilizzare VisualVM per individuare il collo di bottiglia/problema

Ho VisualVM in esecuzione e fatto uno snapshot tra tempi diversi. Ora l'applicazione è molto lenta, ma non ho idea di come individuare il collo di bottiglia. Non hanno molte differenze tra loro e l'unica cosa che cresce un po 'è l'accumulo, che viene raccolto con successo dopo un po'.

Qualcuno può darmi qualche suggerimento?

Ecco le istantanee (apps):

[1] http://www.2shared.com/file/W4XJ6HtE/application-1314108550032.html

[2] http://www.2shared.com/fadmin/22521338/f512f97e/application-1314097232727.apps.html

Grazie!

EDIT: Guardando più da vicino, ho notato che la CPU non viene nemmeno utilizzata molto .. e il sistema è molto lento!

+0

Nella seconda fotografia istantanea (che va oltre un'ora mentre il primo va oltre 4 secondi solo) c'è qualche carico sulla CPU e quasi nessun carico creato dal GC. Se la CPU è il collo di bottiglia dovresti provare a profilare quali metodi lo stanno causando. Puoi farlo anche in jvisualvm. – ziggystar

+0

Su quale app server è in esecuzione l'applicazione? È dietro un front-end del web server? Se sì, come sono i 2 connessi (quale modulo). – atrain

risposta

4

In realtà, ci sono alcuni strumenti migliori di VisualVM.

Si potrebbe provare JProfiler, che è un bel profiler (ma a pagamento)

E si potrebbe provare il profiler Netbeans, che è gratuito e funziona alla grande

Con VisualVM vedrete solo lo stato attuale della tua applicazione (utilizzo della memoria e della CPU, JMX, classi caricate, ecc.).

+3

Ci sono strumenti migliori; ma questo non significa che tu ne abbia bisogno in questo caso (ciò che attualmente non posso giudicare). JvisualVM include anche un profiler (sia di strumentazione che di campionamento) e un profiler di memoria. Inoltre è possibile installare plugin aggiuntivi. – ziggystar

+0

@ziggystar Buono a sapersi, non lo sapevo! –

6

Come primo passo suggerirei di identificare cosa è esattamente lento. Esegue un po 'di lavoro lentamente? O dimostra un basso throughput sulla gestione dei lavori da diversi client?

Quale risorsa non è sufficiente?

  • Se si utilizza alcuni servizi esterni (come database o del server RPC) sempre log loro tempo di risposta e verificare prima di effettuare eventuali altre misure di ottimizzazione.
  • Potrebbe essere una mancanza di potenza del processore. Basta guardare l'utilizzo della CPU.
  • Potrebbe essere una mancanza di memoria. Usa gc logging per rilevare questo tipo di problemi. C'è uno good topic su di esso.
  • Potrebbe essere una mancanza di velocità del disco rigido. Utilizzare iostat e conoscere i limiti delle prestazioni dell'HDD.
  • Potrebbe essere una mancanza di throughput di rete. Verifica l'utilizzo del canale di rete.
  • Inoltre è possibile che si esauriscano alcuni limiti specifici del sistema operativo, ad esempio il numero di file aperti e/o socket di rete. Verificare di segnalare correttamente tutte le eccezioni a livello di sistema operativo nei file di registro.

Come è stato identificato quale risorsa non è sufficiente e la parte del programma che ne risente potrebbe provare a trovare il codice del codice da ottimizzare. Prendere uno strumento casuale ed eseguire la tua applicazione senza sapere cosa cercare non ha senso.

Dalla mia esperienza personale è molto raro quando si dispone di un metodo lento, che può essere trovato con un profiler.Molto probabilmente si tratta di un I/O imprevisto e/o sincronizzazione da qualche parte nell'algoritmo o in uno schema di database errato.

0

Non darei per scontato che si tratti di un problema con l'applicazione, Se si tratta di un sistema basato su Windows, guardare scanner antivirus, qualsiasi schedulatore di aggiornamento in esecuzione in quel momento.

Assicurarsi che i registri si stiano verificando e il debug sia filtrato correttamente in modo che non crescano senza controllo.

Controllare le istantanee SQL per qualsiasi query a esecuzione prolungata. Controllare il carico del DB e l'heap del database.

Se Visual VM è in esecuzione da un po 'di tempo, assicurarsi di avere alcuni thread pronti ad accettare il lavoro/le connessioni mostreranno il colore giallo (inattivo).

Un colpo nel buio Eclipse Memory Analyzer

prendere una discarica di heap quando si nota un rallentamento ed eseguirlo attraverso l'analizzatore.

Se su un sistema basato su unix, controllare i descrittori di file ulimit -a per assicurarsi che il processo java non sia al massimo.

Controllare le impostazioni dei limiti TCP Nessun ritardo e Nagle sul server

Problemi correlati