【问题标题】:Tomcat consuming high CPUTomcat消耗高CPU
【发布时间】:2009-04-22 16:12:27
【问题描述】:

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

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

【问题讨论】:

  • 当我重新启动 Tomcat 服务器时,它位于 10 - 15%,我开始使用应用程序“A”,一旦它被使用超过 5-6 倍,CPU 在 60 - 70% 时停止并且从不降低。然后我需要重新启动服务器。相同的应用程序在生产盒上运行,它不会产生问题,但在 UAT 盒上它是......

标签: tomcat cpu-usage tomcat5.5


【解决方案1】:

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

【讨论】:

  • 如果你想在文件中保存输出,你可以使用 jstack 命令: jstack > filename .PS jstack 在 jdf 发行版中
  • 谢谢@Frizz1977 :)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    YourKit 与 tomcat 有更好的集成。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        首先(这适用于所有 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 使用率过高的问题。

        【讨论】:

          【解决方案6】:

          我们刚刚解决了一个问题,我们的 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%)实现我们想要的。

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2018-10-22
                    • 2015-05-18
                    • 1970-01-01
                    • 2019-04-04
                    • 1970-01-01
                    • 2010-11-05
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多