Tomcat消耗高CPU

时间:2009-04-22 16:12:28

标签: tomcat cpu-usage tomcat5.5

Tomcat.exe占用了75%的CPU。 有谁知道它为什么会发生,怎么会减少?

我正在使用Tomcat5.5& J2SDK v 1.4.2_12

10 个答案:

答案 0 :(得分:10)

如果你使用的是75%的CPU并且不明白为什么,我建议你向tomcat进程发出一个kill -3(如果你有一个控制台,则为ctrl-break)以获得一个线程转储(当负载很高时! )。根据我的经验,大多数线程应该是空闲的或者在等待中。寻找在堆栈跟踪中重复出现的任何单个代码分支,这是你可能的罪魁祸首(非等待!)。这是“穷人的探究者”,通常是解决这些问题的最佳和最有效的方法。

答案 1 :(得分:4)

要了解发生了什么,您应该尝试在分析器下运行它。尝试使用YourKit(http://www.yourkit.com/)或Netbeans(http://profiler.netbeans.org/docs/help/5.5/profile_j2ee_profileproject.html)。

YourKit可以更好地与tomcat集成。

答案 2 :(得分:4)

Lambda Probe是监控Tomcat的一个非常方便的工具。

您使用的是四核CPU系统吗?可能Tomcat在其中3个中运行100%。我首先在应用程序中测试无限循环或类似的东西。

答案 3 :(得分:4)

我的日志充满了Tomcat日志。我删除了所有这些并且CPU使用率大幅下降。

答案 4 :(得分: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使用情况。

答案 5 :(得分:1)

所有答案都涵盖了如何进行准确的诊断,此外我还要补充一点,根据我的经验,你的一个应用程序中的无限循环可能是罪魁祸首。

正如J-16 SDiZ所说,最好的办法是运行探查器将问题缩小到一个应用程序。

答案 6 :(得分:1)

我们刚解决了一个问题,那就是我们的tomcat实例以很高的cpu使用率运行,每隔几秒钟摆动到100%甚至更多,然后再次短暂下降。无论服务器是否正在执行任何工作,这种情况都会整天整夜发生。我们正在使用Java 8运行tomcat8。

我们没有在网络搜索中找到我们的解决方案,因此我将其发布在这里,希望对其他人有所帮助。

我们在tomcat / conf / Catalina / localhost目录中使用了配置选项,在其中我们将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 / Catalina / localhost目录中删除了xml文件,然后重新启动了tomcat。突然,我们又有了一个正常的,行为良好的雄猫。为了将tomcat指向另一个目录(我们在其中编译dspace代码),我们仅使用了conf / server.xml中的Host条目,并将appBase设置更改为我们的dspace目录:

<Host name="localhost"  appBase="/opt/dspace/amaddev/dspace-6.3/webapps"
        unpackWARs="true" autoDeploy="true">

现在,当服务器处于安静状态时,它以非常低的cpu使用率(低于1%)实现了我们想要的目标。

答案 7 :(得分:1)

就我而言,我刚刚使用默认设置安装了Tomcat8。我必须设置内存参数-Xms -Xmx。一次,我增加了对JVM的内存分配,CPU利用率急剧下降。

答案 8 :(得分:0)

这很可能是由您在tomcat上运行的应用程序引起的。当然,如果您的应用程序的流量非常高,这也可能就是原因。

答案 9 :(得分:0)

我建议查看Tomcat日志文件,尤其是名为catalina.out的文件。 以我为例,该文件正在快速扩展,并显示错误消息“没有权限读取文件夹/ var / lib / mysql”。我的应用程序包括监视文件夹/ var / lib / mysql的监视服务。通过允许应用程序读取此文件夹,CPU使用率急剧下降。系统更新后,可以更改访问文件夹和文件的权限,但CPU使用率很高。因此,CPU使用率高的原因可能在Web应用程序外部,也可能在Tomcat容器外部。