です。Tomcat.exeはCPUの75%を消費しています。 なぜ起こるのか、それをどのように減らすことができますか?高CPUを消費するTomcatは
私はこれが最も可能性の高いあなたにTomcat上で動作しているアプリケーション(複数可)によって引き起こされる1.4.2_12
です。Tomcat.exeはCPUの75%を消費しています。 なぜ起こるのか、それをどのように減らすことができますか?高CPUを消費するTomcatは
私はこれが最も可能性の高いあなたにTomcat上で動作しているアプリケーション(複数可)によって引き起こされる1.4.2_12
何が起きているのかを理解するには、プロファイラの下で実行するようにしてください。 YourKit(http://www.yourkit.com/)またはNetbeans(http://profiler.netbeans.org/docs/help/5.5/profile_j2ee_profileproject.html)を試してください。
YourKitはtomcatとの統合性が優れています。
vのTomcat5.5 & J2SDKを使用しています。もちろん、アプリケーションのトラフィックが非常に多い場合は、これが原因かもしれません。
75%のCPUを使用していて、理由を理解できない場合は、スレッドダンプを取得するためにtomcatプロセスにkill -3を発行することをお勧めします(コンソールがある場合はctrl-break) !)。私の経験では、ほとんどのスレッドはアイドル状態またはio-waitのいずれかでなければなりません。スタックトレースで繰り返し発生したコードの単一のブランチを探してください。それがあなたの可能性の高い原因です(non-io waits!)。これは、「貧乏人のプロファイラ」であり、これらの問題を解決するのに最もよく、最も効率的な方法です。
すべての答えは正確な診断方法をカバーしています。加えて、私の経験から、あなたのアプリケーションの無限ループが原因かもしれないと付け加えます。
J-16 SDiZによると、プロファイラを実行して問題を1つのアプリケーションに絞り込むことをお勧めします。
Lambda Probeは、Tomcatを監視するための非常に便利なツールです。
クワッドCPUシステムを使用していますか?たぶんTomcatは3人で100%稼働しているでしょう。私は最初に、アプリケーション内で無限ループなどのテストを行います。
まず、すべての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)です。
ログにはTomcatログがいっぱいでした。私はそれらのすべてを削除し、CPU使用率は大幅に低下しました。
Tomcatサーバーを10〜15%で再起動すると、アプリケーション 'A'を使用し始めます。これは、CPU使用率が60〜70%を5〜6倍以上使用しても一度も低下しません。私はその後、サーバーを再起動する必要があります。同じアプリケーションがProductionボックス上で実行されていて、問題が発生していませんが、UATボックスには... – Miral