题
Tomcat.exe 消耗了 75% 的 CPU。有谁知道为什么会发生这种情况以及如何减少这种情况?
我正在使用 Tomcat5.5 和 J2SDK v 1.4.2_12
解决方案
要了解发生了什么,您应该尝试在分析器下运行它。尝试一下 YourKit (http://www.yourkit.com/) 或 Netbeans (http://profiler.netbeans.org/docs/help/5.5/profile_j2ee_profileproject.html).
YourKit 与 tomcat 集成得更好。
其他提示
如果您正在使用75%的CPU和不明白为什么,我建议你发出杀-3到Tomcat进程(用CTRL-Break如果你有一个控制台)来获取一个线程转储(当负载是高! )。在我的经验,多数线程要么被闲置或IO-等待。寻找代码的任何单支已经重复出现次数的堆栈跟踪,这就是你的可能是罪魁祸首(非IO等待!)。这是“穷人的仿形”这是经常解决这些问题的最佳和最有效的方式。
λ探针是用于监测Tomcat的一个非常方便的工具。
您使用的是四核CPU的系统?可能的Tomcat在他们3运行的100%。我首先测试在应用程序中一个无限循环或类似的东西。
我的日志充满Tomcat的日志。我删除了所有这些,CPU的使用率已经大大下降。
首先(这适用于所有的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使用率过高。
所有的答案包括如何做一个准确的诊断,除了我想补充一点,从我的经验,在应用程序中的一个无限循环可能是罪魁祸首。
作为J-16 SDiZ说,最好的办法是运行探查到缩小问题于一个应用程序。
我们只是解决了一个问题,我们的Tomcat实例具有非常高的CPU使用率运行,摆动高达100%,每隔几秒钟,然后再次短暂下跌。这发生整天和一整夜,服务器是否正在执行任何工作或没有。我们正在运行Tomcat 8用java 8.
我们没有发现我们的网络搜索解决方案,所以我在帮助别人的希望在这里张贴。
我们曾用在tomcat / conf目录/卡塔利娜/本地主机目录的配置选项,在其中我们指出的tomcat到另一个目录,除了其自身的webapps目录等。此目录中的XML文件是这样的:
<?xml version='1.0'?>
<Context
docBase="/opt/dspace/amaddev/dspace-6.3/webapps/jspui"
reloadable="true"
cachingAllowed="false"/>
和这个工作,Tomcat的运行,在这些目录中,而不是自己的webapps目录下的代码。但是,我们有这个问题,不断飙升的CPU使用率。
要测试,我们从CONF /卡塔利娜/本地主机目录除去XML文件,并重新启动Tomcat的。突然,我们再有一个正常的,乖巧的Tomcat。为了指向tomcat的这个其他目录(在这里我们编译我们的dSPACE代码),我们只是使用的conf / server.xml中的主机项,并改变了的appBase设置为我们的dSPACE目录:
<Host name="localhost" appBase="/opt/dspace/amaddev/dspace-6.3/webapps"
unpackWARs="true" autoDeploy="true">
这现在实现了我们想要用很低的CPU使用率(低于1%),当服务器是安静的。
在我的情况,我刚刚安装Tomcat8使用默认设置。我必须设置内存参数-Xms -Xmx
。有一次,我增加了内存分配到JVM,CPU利用率下来急剧下降。
这很可能是由您正在对Tomcat的顶部运行的应用(一个或多个)而引起的。当然,如果你有你的应用是非常高的流量,这也可能是原因。