14

Tomcat.exe は CPU の 75% を消費しています。なぜそれが起こるのか、どうすればそれを減らすことができるのか、誰にも分かりますか?

Tomcat5.5 & J2SDK v 1.4.2_12 を使用しています

4

10 に答える 10

10

75%のCPUを使用していて、その理由がわからない場合は、Tomcatプロセス(コンソールがある場合はctrl-break)にkill -3を発行して、スレッドダンプを取得することをお勧めします(負荷が高い場合)。私の経験では、ほとんどのスレッドはアイドル状態かio-waitのいずれかである必要があります。スタックトレースで繰り返し発生し、それが原因である可能性が高いコードの単一のブランチを探します(非io待機!)。これは「貧乏人のプロファイラー」であり、これらの問題を解決するための最良かつ最も効率的な方法であることがよくあります。

于 2009-04-22T16:20:24.367 に答える
5

私のログは Tomcat のログでいっぱいでした。それらをすべて削除したところ、CPU 使用率が劇的に低下しました。

于 2011-11-02T05:18:34.117 に答える
4

何が起こっているのかを理解するには、プロファイラーの下で実行してみてください。YourKit(http://www.yourkit.com/)またはNetbeans(http://profiler.netbeans.org/docs/help/5.5/profile_j2ee_profileproject.html)を試してください。

YourKitは、Tomcatとの統合が優れています。

于 2009-04-22T16:19:32.437 に答える
4

Lambda Probeは、Tomcat を監視するための非常に便利なツールです。

クワッド CPU システムを使用していますか? おそらくそのうちの 3 つで Tomcat は 100% 実行されています。最初に、アプリケーションで無限ループなどをテストします。

于 2009-04-22T16:27:40.280 に答える
3

最初に (これはすべての Java アプリケーションに適用されます)、CPU を使用しているスレッドを特定する必要があります。これは JDK 1.6 で可能です。これは、java.lang.management.ManagementFactory.getThreadMXBean() を使用して行われます。使用例(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));
}
%>

その後、スレッド ダンプを取得し、このスレッドのコードを分析して、過剰な CPU 使用率を修正できます。

于 2010-06-28T12:19:53.843 に答える
1

すべての回答は、正確な診断を行う方法をカバーしています。さらに、私の経験から、アプリケーションの 1 つでの無限ループがおそらく原因であると付け加えます。

J-16 SDiZ が言ったように、プロファイラーを実行して問題を 1 つのアプリケーションに絞り込むのが最善の策です。

于 2009-04-22T16:25:49.473 に答える
0

これは、Tomcat上で実行しているアプリケーションが原因である可能性があります。もちろん、アプリケーションのトラフィックが非常に多い場合は、これも理由である可能性があります。

于 2009-04-22T16:16:31.443 に答える