实时服务器使用率高 CPU 时的线程转储分析

Thread dump analysis when live server has high CPU usage

从 Java 中使用某些数据库开发的典型 MVC/web 应用程序的角度来看:假设应用程序服务器托管在一台服务器上,而数据库托管在另一台服务器上。如果我们在服务器(托管应用程序服务器)上的 live 上达到高 CPU usage/slowness,那么我们将进行线程转储并根据以下规则找出 "culprit" 线程:

1) 如果有缓慢的 运行 SQL(从 Web 应用程序内部触发)/数据库很慢,那么它永远不会导致托管应用程序服务器的服务器具有高 CPU 使用率。数据库缓慢只会使应用程序变慢。数据库缓慢导致应用程序线程处于 BLOCKED/WAITING 状态,因为这些线程 "fight/compete" 获得 "limited" 数据库访问权限(典型的连接池内容)。

2) 罪魁祸首总是线程(处于 RUNNABLE 状态)在应用程序服务器层上做一些 activity 像 运行 在相当长的 while 循环中 and/or 做一些密集的 operation/calculation.

谁能帮忙验证一下上面的理解?

确实,如果数据库是瓶颈,那么应用服务器通常不会有高 CPU 利用率。

确实有很多应用程序服务器线程处于 RUNNABLE 状态会导致高 CPU 利用率,但这并不是 ALWAYS 高 [=] 的原因21=]利用率。

当应用服务器 JVM 运行 内存不足(and/or 应用生成大量垃圾)并且 JVM 花费了过多的精力( CPU) 关于垃圾回收。

有许多工具,例如 jvisualvm(包含在 JDK 中)可以立即明确问题所在。