Domanda

tomcat.exe sta consumando il 75% della CPU. C'è qualcuno che sta avendo alcuna idea perché accade e come può essere ridotta?

Sto usando tomcat5.5 & J2SDK 1.4.2_12 v

È stato utile?

Soluzione

Per capire cosa sta succedendo, si dovrebbe cercare di correre sotto un profiler. Provate il YourKit ( http://www.yourkit.com/ ) o Netbeans ( http://profiler.netbeans.org/docs/help/5.5/profile_j2ee_profileproject.html ).

Il YourKit uno ha una migliore integrazione con Tomcat.

Altri suggerimenti

Se si utilizza il 75% della CPU e non capisco il motivo per cui, vi consiglio di emettere un kill -3 al processo di Tomcat (ctrl-break se si dispone di una console) per ottenere un dump filo (quando il carico è alto! ). Nella mia esperienza la maggior parte delle discussioni dovrebbero essere sia inattivo o in IO-wait. Cercare ogni singolo ramo di codice che ha ripetuto occorrenze nelle tracce di stack e questa è la vostra colpevole probabili (attese non io!). Questo è "profiler dei poveri" il che è abbastanza spesso il modo migliore e più efficace per risolvere questi problemi.

Sonda Lambda è uno strumento molto utile per monitorare Tomcat.

Si sta utilizzando un sistema quad CPU? Probabilmente Tomcat è in esecuzione al 100% in 3 di loro. Desidero in primo luogo verificare un ciclo infinito o qualcosa del genere in un'applicazione.

I miei tronchi erano piene di tronchi Tomcat. Ho cancellato tutti loro e l'utilizzo della CPU è andato drammaticamente verso il basso.

Innanzitutto (questo vale per tutte le applicazioni Java) è necessario definire quale thread utilizza CPU. Ciò è possibile in JDK 1.6. Si è fatto utilizzando 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 fissare un eccessivo utilizzo della CPU.

Tutte le risposte coprono come fare una diagnosi precisa, inoltre vorrei aggiungere che, dalla mia esperienza, un ciclo infinito in una delle vostre applicazioni è probabilmente il colpevole.

Come ha detto J-16 SDiZ, la cosa migliore è di eseguire il profiler per circoscrivere il problema a una sola applicazione.

Abbiamo appena risolto un problema con il nostro esempio tomcat esecuzione con l'utilizzo molto elevato di CPU, oscillare fino al 100% e più ogni pochi secondi e poi brevemente di nuovo. Ciò è avvenuto per tutto il giorno e tutta la notte, se il server è stato di effettuare qualsiasi operazione o meno. Ci sono in esecuzione Tomcat 8 con java 8.

Non abbiamo trovato la nostra soluzione in una ricerca sul web, così mi distacco qui nella speranza di aiutare qualcun altro.

Avevamo usato l'opzione di configurazione nella directory tomcat / conf / Catalina / localhost, in cui abbiamo sottolineato Tomcat in un'altra directory, diversa dalla propria directory webapps. I file XML in questa directory simile a questa:

<?xml version='1.0'?>
<Context
docBase="/opt/dspace/amaddev/dspace-6.3/webapps/jspui"
reloadable="true"
cachingAllowed="false"/>

E questo ha funzionato, Tomcat correva con il codice in queste directory, piuttosto che la propria directory webapps. Tuttavia, abbiamo avuto questo problema con continuamente chiodare l'utilizzo della CPU.

Per testare, abbiamo rimosso i file XML dalla directory / localhost conf / Catalina, e riavviato Tomcat. Improvvisamente abbiamo avuto di nuovo un normale, Tomcat ben educati. Al fine di puntare il gatto a questa altra directory (in cui si compila il nostro codice dspace), abbiamo usato solo la voce Host in conf / server.xml, e cambiato l'impostazione al nostro indice dspace AppBase:

<Host name="localhost"  appBase="/opt/dspace/amaddev/dspace-6.3/webapps"
        unpackWARs="true" autoDeploy="true">

Questo compie ora quello che volevamo con un utilizzo della CPU molto basso (inferiore all'1%), quando il server è tranquillo.

Nel mio caso, avevo appena installato Tomcat8 con le impostazioni predefinite. Ho dovuto impostare i parametri di memoria -Xms -Xmx. Una volta, ho aumentato l'allocazione della memoria per JVM, l'utilizzo della CPU è sceso drasticamente.

Questa è probabilmente causato dall'applicazione (s) che si esegue in cima alla Tomcat. Naturalmente se si dispone di traffico molto elevato sulle applicazioni, questo potrebbe anche essere il motivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top