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
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
Per capire cosa sta succedendo, dovresti provare a eseguirlo con un profiler. Prova il tuoKit (http://www.yourkit.com/) o Netbeans (http://profiler.netbeans.org/docs/help/5.5/profile_j2ee_profileproject.html).
TheKit One ha una migliore integrazione con tomcat.
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.
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.
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.
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.
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.
I miei registri erano pieni di registri di Tomcat. Li ho cancellati tutti e l'utilizzo della CPU è diminuito drasticamente.
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