2009-04-22 16 views
12

Tomcat.exe sta consumando il 75% della CPU. Qualcuno ha idea del perché succede e come può essere ridotto?Tomcat consuma CPU elevata

Sto usando tomcat5.5 & J2SDK v 1.4.2_12

+0

Quando riavvio il server Tomcat, che giace al 10 - 15%, inizio a utilizzare un'applicazione "A", una volta utilizzata più di 5-6 volte la CPU ferma al 60 - 70% e non si abbassa mai. Ho bisogno di riavviare il server allora. La stessa applicazione è in esecuzione su Production box e non sta creando un problema, ma nella casella UAT è ... – Miral

risposta

0

Questo è probabilmente causato dall'applicazione (s) che si esegue in cima alla Tomcat. Naturalmente se hai un traffico molto elevato sulle tue applicazioni, questa potrebbe essere la ragione.

9

Se si utilizza il 75% di CPU e non capisco il motivo, suggerisco di inviare un kill -3 al processo tomcat (ctrl-break se si dispone di una console) per ottenere un dump del thread (quando il carico è alto !). Nella mia esperienza la maggior parte dei thread dovrebbe essere inattiva o in attesa. Cerca qualsiasi singolo ramo di codice che abbia ripetuto occorrenze nelle tracce dello stack e questo è il tuo probabile colpevole (non-io aspetta!). Questo è il "profiler del povero uomo" che è spesso il modo migliore e più efficace per risolvere questi problemi.

+0

Se vuoi salvare l'output su file puoi usare il comando jstack: jstack > nomefile .PS jstack è nel distribuzioni jdf – Frizz1977

+0

Grazie @ Frizz1977 :) – cig0

1

Tutte le risposte spiegano come eseguire una diagnosi esatta, inoltre vorrei aggiungere che, dalla mia esperienza, probabilmente un colpevole è un loop infinito in una delle applicazioni.

Come ha detto J-16 SDiZ, la soluzione migliore è eseguire il profiler per limitare il problema a un'applicazione.

4

Lambda Probe è uno strumento molto utile per il monitoraggio di Tomcat.

Si sta utilizzando un sistema quad CPU? Probabilmente Tomcat esegue il 100% in 3 di essi. Per prima cosa testerei per un ciclo infinito o qualcosa di simile in un'applicazione.

3

Prima di tutto (questo vale per tutte le applicazioni java) è necessario definire quale thread utilizza la CPU. Questo è possibile in JDK 1.6. È fatto usando java.lang.management.ManagementFactory.getThreadMXBean(). Ecco esempio di utilizzo (JSP):

<%@ page import="java.lang.management.*, java.util.*" %> 
<%! 
    Map cpuTimes = new HashMap(); 
    Map cpuTimeFetch = new HashMap(); 
%><% 
long cpus = Runtime.getRuntime().availableProcessors(); 
ThreadMXBean threads = ManagementFactory.getThreadMXBean(); 
long now = System.currentTimeMillis(); 
ThreadInfo[] t = threads.dumpAllThreads(false, false); 
for (int i = 0; i < t.length; i++) { 
    long id = t[i].getThreadId(); 
    Long idid = new Long(id); 
    long current = 0; 
    if (cpuTimes.get(idid) != null) { 
     long prev = ((Long) cpuTimes.get(idid)).longValue(); 
     current = threads.getThreadCpuTime(t[i].getThreadId()); 
     long catchTime = ((Long) cpuTimeFetch.get(idid)).longValue(); 
     double percent = (current - prev)/((now - catchTime) * cpus * 10000); 
     if (percent > 0 && prev > 0) { 
      out.println("<li>" + t[i].getThreadName() + " " + percent + " (" + prev + ", " + current + ")");  
     } 
    } 
    cpuTimes.put(idid, new Long(current)); 
    cpuTimeFetch.put(idid, new Long(now)); 
} 
%> 

Dopo di che si può ottenere un dump filo e analizzare il codice in questa discussione per risolvere l'utilizzo della CPU eccessivo.

4

I miei registri erano pieni di registri di Tomcat. Li ho cancellati tutti e l'utilizzo della CPU è diminuito drasticamente.

Problemi correlati