Frage

Tomcat.exe verbraucht 75% der CPU. Ist jemand eine Ahnung, warum es passiert und wie kann das verringert werden?

Ich bin mit tomcat5.5 & J2SDK v 1.4.2_12

War es hilfreich?

Lösung

Um zu verstehen, was passiert, sollten Sie versuchen, es unter einem Profiler zu laufen. Versuchen Sie, die YourKit ( http://www.yourkit.com/ ) oder Netbeans ( http://profiler.netbeans.org/docs/help/5.5/profile_j2ee_profileproject.html ).

Die YourKit eine bessere Integration mit tomcat.

Andere Tipps

Wenn Sie mit 75% CPU und versteht nicht, warum, empfehle ich Ihnen eine Kill-Ausgabe -3 bis den Kater Prozess (ctrl-Pause, wenn Sie eine Konsole) ein Thread-Dump zu erhalten (wenn die Last hoch ist! ). Nach meiner Erfahrung sollten die meisten Fäden entweder frei oder in io-warten. Geben Sie für jeden einzelnen Zweig des Codes, die Vorkommen in den Stack-Traces wiederholt hat, und das ist Ihr wahrscheinlich Täter (nicht-io wartet!). Dies ist der „schlechte Profiler des Menschen“, die recht häufig ist der beste und effizienteste Weg, um diese Probleme zu lösen.

Lambda-Sonde ist ein sehr praktisches Tool für Tomcat zu überwachen.

Sind Sie mit einem Quad-CPU-System? Wahrscheinlich Tomcat läuft zu 100% in 3 von ihnen. Ich würde zunächst für eine Endlosschleife testen oder so etwas in einer Anwendung.

Meine Protokolle waren voll von Tomcat-Protokolle. Ich löschte alle von ihnen und die CPU-Auslastung hat sich dramatisch zurückgegangen.

Zu allererst (dies gilt für alle Java-Anwendungen) Sie festzunageln muss, welcher Thread CPU verwendet. Dies ist möglich, in JDK 1.6. Es erfolgt durch java.lang.management.ManagementFactory.getThreadMXBean () verwenden. Hier ist Beispiel für die Verwendung (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));
}
%>

Danach können Sie einen Thread-Dump erhalten und den Code in diesem Thread analysieren, um eine übermäßige CPU-Auslastung zu beheben.

Alle Antworten, wie eine genaue Diagnose zu tun, zusätzlich würde ich hinzufügen, dass aus meiner Erfahrung, eine Endlos-Schleife in einen Ihrer Anwendungen ist wahrscheinlich der Täter.

Als J-16 SDiZ sagte, die beste Wahl ist, den Profiler zu verengen, das Problem auf eine Anwendung auszuführen.

Wir lösten nur ein Problem mit unserem Kater Instanz mit einem sehr hohen CPU-Auslastung ausgeführt wird, zu 100% swinging und mehr alle paar Sekunden und dann wieder kurz nach unten. Dies geschah den ganzen Tag und die ganze Nacht lang, ob der Server eine Arbeit oder nicht ausführt. Wir laufen tomcat 8 mit Java 8.

Wir haben nicht unsere Lösung in einer Web-Suche finden, so dass ich es hier in der Hoffnung, jemand anderes helfen bin Entsendung.

Wir hatten die Konfigurationsoption in der tomcat / conf / Catalina / localhost Verzeichnis verwendet, in dem wir tomcat in ein anderes Verzeichnis zugespitzt, mit Ausnahme der eigenen webapps-Verzeichnis. Die XML-Dateien in diesem Verzeichnis wie folgt aussehen:

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

Und das funktionierte, lief Kater mit dem Code in diesen Verzeichnissen, anstatt eigenes webapps Verzeichnis. Allerdings hatten wir dieses Problem mit ständig Spick CPU-Auslastung.

Um zu testen, entfernten wir die XML-Dateien aus der conf / Catalina / localhost Verzeichnis und neu gestartet Kater. Plötzlich hatten wir einen normalen, gut erzogene Kater wieder. Um den Kater zu diesem anderen Verzeichnis zu zeigen (wo wir unseren dspace Code zu kompilieren), haben wir nur den Host-Eintrag in conf / server.xml, und änderten die appBase in unserem dspace Verzeichnis festlegen:

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

Dies erreicht jetzt, was wir mit einer sehr niedrigen CPU-Auslastung (unter 1%) wollten, wenn der Server ruhig ist.

In meinem Fall hatte ich gerade Tomcat8 mit den Standardeinstellungen installiert. Ich musste Speicherparameter -Xms -Xmx gesetzt. Einmal, ich erhöhte Speicherzuweisung an JVM, die CPU-Auslastung kam drastisch nach unten.

Dies wird höchstwahrscheinlich durch die Anwendung verursacht (s), die Sie auf dem Tomcat ausgeführt werden. Natürlich, wenn Sie auf Ihren Anwendungen sehr hohen Verkehr haben, dies auch der Grund sein könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top