【问题标题】:Tomcat spiking and consuming all available CPUTomcat 飙升并消耗所有可用的 CPU
【发布时间】:2016-03-02 15:15:45
【问题描述】:

生产服务器中的 Tomcat (8.0.14-1+deb8u1) 突然占用所有 CPU,如何诊断原因?我知道分析器可能会派上用场,但不能在生产环境中使用,有什么想法吗?

附加信息: "top" command execution/lsb_release

【问题讨论】:

  • 内存/jmap 输出在:pastebin.com/UVJzfn1u
  • 线程/jstack 输出pastebin.com/282hfyvv
  • JVM: java 版本 "1.7.0_91" OpenJDK 运行时环境 (IcedTea 2.6.3) (7u91-2.6.3-1~deb8u1) OpenJDK 64 位服务器 VM (build 24.91-b01, 混合模式)

标签: performance tomcat cpu-usage tomcat8 profiler


【解决方案1】:

@Gonzalo 我已经看到您提供了几乎所有必要的信息,但我会从“开始”写下我的答案,因此对于偶然发现它的经验不足的用户可能会有所帮助。

  1. 您应该进行线程转储。你可以这样做:

    • 杀死 -3 PID
    • jstack -F PID
  2. 查看tophtop 命令输出。

    • 对于top,按“shift + h”显示线程(您也可以以top -p PID开头以过滤掉不相关的进程)
    • 找出哪个线程消耗CPU并记下线程ID
    • 线程 ID 是十进制的,所以你必须把它转换成十六进制。
  3. 打开线程转储并查找十六进制线程。这是消耗CPU的线程

PS:你的线程转储看起来很奇怪,它错过了线程 ID。线程堆栈应该像这样开始:

"Finalizer" daemon prio=8 tid=0x02b3d000 nid=0x898 in Object.wait() [0x02d0f000]
...stack traces here...

nid 是您从 top/htop 中找到的十六进制线程 ID。

尝试使用 kill -3 进行转储

【讨论】:

  • 在问题 JVM 版本中作为注释添加,以防万一。
  • 尝试使用 kill -3 获取堆转储但没有用,jstack 有效,仅使用来自 'ps' 的 PID 而不是来自线程的 PID 购买(通过 top + shift-h)跨度>
  • 您应该使用 JVM 进程的 PID 进行转储,而不是线程。您需要线程 id,以查找哪个堆栈跟踪对应于 CPU 使用率
  • 顶部输出:picpaste.com/…
  • @GonzaloVasquez 所以这些是错误的线程pastebin.com/BGvfqGQZ。似乎问题出在其中一种方法中:InsertMovilProcessInsertMovilClienteUpdateMovilCache。但是如果没有源代码和调试器,我无法确定问题到底是什么,但它仍然是进一步调查的一个很好的起点
【解决方案2】:

我们在几台服务器上遇到了同样的问题。这个问题也出现在没有 Web 应用程序的 Tomcat 服务器上,只提供静态页面。 cpu 使用率突然旋转到 200% 并且从未下降

在我们最近升级到 8.0.14 和 8_u_121 之前,这个问题从未出现过

设置如下:

  • debian 8.1,最新补丁
  • tomcat 8.0.14
  • oracle jvm 8_u_121(截至目前最新)
  • 2.4 和 8 GB 内存(取决于服务器)
  • 80 上的 http/1.1 连接器重定向到 443;在 443 上使用 https 的 nio1 连接器(实际上在 8080 和 8443 上,防火墙将 80 映射到 8080 和 443 到 8443)

当问题出现时,症状如下:

  • 进程“java”的 CPU 使用率为 200%,没有下降
  • 内存消耗正常
  • apps.log 中没有日志条目
  • catalina.out 中大约 20 个条目如下:

2017 年 1 月 30 日 10:15:38.479 信息 [http-nio-8080-exec-16] org.apache.coyote.http11.AbstractHttp11Processor.process 解析错误 HTTP 请求头注意:更多的 HTTP 头解析 错误将在 DEBUG 级别记录。 2017 年 1 月 30 日 10:15:40.022 信息 [http-nio-8080-exec-17] org.apache.coyote.http11.AbstractHttp11Processor.process 解析错误 HTTP 请求头注意:更多的 HTTP 头解析 错误将在 DEBUG 级别记录。 2017 年 1 月 30 日 10:15:41.574 信息 [http-nio-8080-exec-18] org.apache.coyote.http11.AbstractHttp11Processor.process 解析错误 HTTP 请求头

当我们升级到 8.0.14 时,我们在 catalina.out 中有类似的错误消息。这是因为此版本不再接受 url 中未转义的 { 和 }。我们通过更改我们的客户端代码将这些字符编码为 %4B 和 %4D 来修复它。当时没有cpu问题

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多