Tomcat尖峰并消耗所有可用的CPU

时间:2016-03-02 15:15:45

标签: performance tomcat cpu-usage tomcat8 profiler

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

其他信息:  "top" command execution / lsb_release

2 个答案:

答案 0 :(得分:1)

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

  1. 你应该进行一次线程转储。你可以通过以下任何一种方式做到这一点:

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

    • 对于top按“shift + h”以显示主题(您也可以使用top -p PID开头,以过滤掉不相关的流程)
    • 查找哪个线程占用CPU并记下线程ID
    • 线程ID是十进制的,因此您必须将其转换为十六进制。
  3. 打开线程转储并查找十六进制线程。这是消耗CPU的线程

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

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

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

    尝试使用kill -3

    进行转储

答案 1 :(得分:0)

我们在几台服务器上遇到了同样的问题。问题也出现在没有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的内存(取决于服务器)
  • http / 1.1连接器80重定向到443;带有https的443上的nio1连接器(实际上是8080和8443,防火墙映射80到8080和443到8443)

出现问题时,症状如下:

  • cpu使用率200%由进程“java”,不会下来
  • ram consumption normal
  • apps.log
  • 中没有日志条目
  • catalina.out中约有20个条目如下:
  

2017年1月30日10:15:38.479 INFO [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 INFO   [HTTP-NIO-8080-EXEC-18]   org.apache.coyote.http11.AbstractHttp11Processor.process解析错误   HTTP请求标头

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