2009-04-22 50 views
12

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

私はこれが最も可能性の高いあなたにTomcat上で動作しているアプリケーション(複数可)によって引き起こされる1.4.2_12

+0

Tomcatサーバーを10〜15%で再起動すると、アプリケーション 'A'を使用し始めます。これは、CPU使用率が60〜70%を5〜6倍以上使用しても一度も低下しません。私はその後、サーバーを再起動する必要があります。同じアプリケーションがProductionボックス上で実行されていて、問題が発生していませんが、UATボックスには... – Miral

答えて

0

vのTomcat5.5 & J2SDKを使用しています。もちろん、アプリケーションのトラフィックが非常に多い場合は、これが原因かもしれません。

9

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

+0

ファイルに出力を保存する場合は、jstackコマンドを使用できます:jstack > filename .PS jstackはjdfディストリビューション – Frizz1977

+0

ありがとう@ Frizz1977 :) – cig0

1

すべての答えは正確な診断方法をカバーしています。加えて、私の経験から、あなたのアプリケーションの無限ループが原因かもしれないと付け加えます。

J-16 SDiZによると、プロファイラを実行して問題を1つのアプリケーションに絞り込むことをお勧めします。

4

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

クワッドCPUシステムを使用していますか?たぶんTomcatは3人で100%稼働しているでしょう。私は最初に、アプリケーション内で無限ループなどのテストを行います。

3

まず、すべてのJavaアプリケーションに適用されます。どのスレッドがCPUを使用しているのかを特定する必要があります。これはJDK 1.6で可能です。これは、java.lang.management.ManagementFactory.getThreadMXBean()を使用して行います。あなたは、スレッドダンプを取得し、過度のCPU使用率を修正するために、このスレッド内のコードを分析することができた後

<%@ 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)); 
} 
%> 

:ここ は使用例(JSP)です。

4

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

関連する問題