2009-04-22 94 views
12

Tomcat.exe消耗75%的CPU。 是否有人有任何想法爲什麼會發生,怎麼可能會減少?Tomcat消耗高CPU

我使用Tomcat5.5中&安裝J2SDK v 1.4.2_12

+0

當我重新啓動Tomcat服務器時,其服務器位於10-15%,我開始使用應用程序'A',一旦它的使用率超過5-6倍CPU停止60-70%並且永遠不會降低。然後我需要重新啓動服務器。同樣的應用程序正在運行在生產框,它不會產生問題,但在UAT框中它是... – Miral 2009-04-23 08:27:34

回答

0

這很可能是由你在tomcat的頂部運行的應用程序(一個或多個)引起的。當然,如果你的應用程序流量很高,這也可能是原因。

9

如果你使用75%的CPU,並不明白爲什麼,我建議你發一個殺死-3的tomcat進程(ctrl-break,如果你有一個控制檯)來獲得線程轉儲(當負載很高!)。根據我的經驗,大多數線程應該閒置或等待。尋找在堆棧跟蹤中重複出現的任何單一代碼分支,這是您可能的罪魁禍首(非IO等待!)。這是「窮人的剖析器」,通常是解決這些問題的最佳和最有效的方法。

+0

如果你想保存輸出的文件,你可以使用jstack命令:jstack >文件名.PS jstack是在jdf分佈 – Frizz1977 2015-02-18 05:13:09

1

所有的答案都涵蓋了如何做一個確切的診斷,另外我會補充一點,根據我的經驗,在你的應用程序中的一個無限循環可能是罪魁禍首。

正如J-16 SDiZ所說,您最好的選擇是運行探查器將問題縮小到一個應用程序。

4

Lambda Probe是一個非常方便的監控Tomcat的工具。

您使用的是四CPU系統嗎?可能Tomcat在其中3箇中運行率達到100%。我會首先在應用程序中測試一個無限循環或類似的東西。

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使用率過高。

4

我的日誌中充滿了Tomcat日誌。我刪除了所有這些,CPU使用率大幅下降。