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

时间:2016-06-21 16:31:51

标签: java multithreading performance production-environment thread-dump

从使用某些数据库在Java中开发的典型MVC / Web应用程序的角度来看:假设app服务器托管在一台服务器上,数据库托管在另一台服务器上。如果我们在服务器(托管应用服务器)上获得高CPU使用率/速度,那么我们采用线程转储和放大器找出"罪魁祸首"线程基于以下规则:

1)如果运行缓慢的SQL(从Web应用程序中触发)/数据库速度很慢,那么它将永远不会导致服务器托管应用服务器具有高CPU使用率。数据库缓慢只会使应用程序变慢。数据库缓慢导致应用程序线程处于BLOCKED / WAITING状态,因为那些线程"对抗/竞争"得到限制"数据库访问(典型的连接池)。

2)罪魁祸首总是线程(处于RUNNABLE状态)在app服务器层上做一些活动,比如在很长时间的循环中运行和/或做一些密集的操作/计算。

任何人都可以帮助验证上述理解吗?

1 个答案:

答案 0 :(得分:2)

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

确实,许多应用服务器线程处于RUNNABLE状态会导致CPU利用率过高,但总是导致CPU利用率过高。

当应用服务器JVM内存不足(和/或应用程序产生大量垃圾)并且JVM在垃圾回收上花费过多的精力(CPU)时,会出现另一个主要替代方案。

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