web-dev-qa-db-ja.com

高いCPUを消費するTomcat

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

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

13
Miral

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

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

4
J-16 SDiZ

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

10
krosenvold

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

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

4
kgiannakakis

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

4
Murali

まず、これはすべての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使用率を修正できます。

3
huksley

非常に高いCPU使用率で実行されているTomcatインスタンスの問題を解決しました。数秒ごとに100%以上になり、その後再び一時的に停止します。これは、サーバーが作業を実行しているかどうかに関係なく、終日終夜発生しました。 Tomcat 8をJava 8で実行しています。

私たちはウェブ検索で解決策を見つけられなかったので、他の誰かを助けることを期待してここに投稿します。

Tomcat/conf/Catalina/localhostディレクトリで構成オプションを使用しました。このオプションでは、Tomcatが独自のwebappsディレクトリ以外の別のディレクトリを指すようにしました。このディレクトリのxmlファイルは次のようになります。

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

そして、これは機能し、Tomcatは独自のwebappsディレクトリではなく、これらのディレクトリ内のコードを実行しました。ただし、CPU使用率が継続的に急上昇するという問題がありました。

テストするために、xmlファイルをconf/Catalina/localhostディレクトリから削除し、Tomcatを再起動しました。突然、正常で行儀のよいTomcatが再び登場しました。 Tomcatがこの別のディレクトリ(dspaceコードをコンパイルする場所)を指すようにするために、conf/server.xmlのHostエントリを使用し、appBase設定をdspaceディレクトリに変更しました。

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

これにより、サーバーが静かなときに、非常に低いCPU使用率(1%未満)で目的を達成できます。

1
excyberlabber

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

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

1
James McMahon

私の場合、Tomcat8をデフォルト設定でインストールしました。メモリパラメータを設定する必要がありました-Xms -Xmx。かつて、JVMへのメモリ割り当てを増やしたところ、CPU使用率が大幅に低下しました。

1
Bhushan

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

0
Juha Syrjälä