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的顶部运行的应用(一个或多个)而引起的。当然,如果你有你的应用是非常高的流量,这也可能是原因。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top