14

Tomcat.exe 占用了 75% 的 CPU。有谁知道为什么会发生这种情况以及如何减少这种情况?

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

4

10 回答 10

10

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

于 2009-04-22T16:20:24.367 回答
5

我的日志充满了 Tomcat 日志。我删除了所有这些,CPU使用率急剧下降。

于 2011-11-02T05:18:34.117 回答
4

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

YourKit 与 tomcat 有更好的集成。

于 2009-04-22T16:19:32.437 回答
4

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

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

于 2009-04-22T16:27:40.280 回答
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 使用率。

于 2010-06-28T12:19:53.843 回答
3

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

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

我们在 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。为了将 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%)实现了我们想要的。

于 2018-12-04T09:50:44.703 回答
1

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

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

于 2009-04-22T16:25:49.473 回答
1

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

于 2019-02-01T14:48:50.043 回答
0

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

于 2009-04-22T16:16:31.443 回答
0

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

于 2020-03-07T21:32:57.507 回答