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

Java 实时服务器CPU使用率高时的线程转储分析,java,multithreading,performance,production-environment,thread-dump,Java,Multithreading,Performance,Production Environment,Thread Dump,从使用某种数据库用Java开发的典型MVC/web应用程序的角度来看:假设应用程序服务器托管在一台服务器上,而数据库托管在另一台服务器上。如果我们在live on server(托管应用程序服务器)上获得高CPU使用率/低速度,那么我们将进行线程转储,并根据以下规则找出“罪魁祸首”线程: 1) 如果存在运行缓慢的SQL(从web应用程序中激发)/数据库运行缓慢,则不会导致承载app server的服务器具有较高的CPU使用率。数据库缓慢只会使应用程序缓慢。数据库缓慢会导致应用程序线程处于阻塞/等

从使用某种数据库用Java开发的典型MVC/web应用程序的角度来看:假设应用程序服务器托管在一台服务器上,而数据库托管在另一台服务器上。如果我们在live on server(托管应用程序服务器)上获得高CPU使用率/低速度,那么我们将进行线程转储,并根据以下规则找出“罪魁祸首”线程:

1) 如果存在运行缓慢的SQL(从web应用程序中激发)/数据库运行缓慢,则不会导致承载app server的服务器具有较高的CPU使用率。数据库缓慢只会使应用程序缓慢。数据库缓慢会导致应用程序线程处于阻塞/等待状态,因为这些线程“斗争/竞争”以获得“有限”的数据库访问(典型的连接池)

2) 罪魁祸首总是线程(处于可运行状态)在应用程序服务器层上执行某些活动,例如在相当长的while循环中运行和/或执行一些密集的操作/计算


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

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

确实,许多应用程序服务器线程处于可运行状态会导致高CPU利用率,但这并不总是高CPU利用率的原因

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


有很多工具,比如jvisualvm(包含在JDK中),可以立即发现问题所在。

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

确实,许多应用程序服务器线程处于可运行状态会导致高CPU利用率,但这并不总是高CPU利用率的原因

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


有很多工具,比如jvisualvm(包括JDK),可以立即发现问题所在。

正确,
阻塞
等待
定时等待
不消耗CPU,所以你应该看看那些
可运行的
@JohnVint我的问题不可能解决“线程状态”导致高CPU(在托管应用程序服务器的服务器上)。这是关于应用程序和数据库-谁杀死了CPU?如果数据库在另一台服务器上(我希望它会这样做)然后,在DB上执行的处理不会影响您的CPU。请求将位于阻塞等待的
socketRead
上。换句话说,DB工作不会导致您的CPU增加。正确的,
阻塞的
等待的
定时等待的
不消耗CPU,因此您应该查看那些被阻塞的
RUNNABLE
@JohnVint我的问题不是关于可能导致高CPU的“线程状态”(在托管app server的服务器上)。而是关于app和DB-谁杀死了CPU?如果DB在另一台服务器上(我希望它会这样做)然后,在DB上执行的处理不会影响您的CPU。请求将位于被阻止等待的
socketRead
上。换句话说,DB工作不会导致您的CPU增加。我今天偶然发现了一篇支持您观点的相关文章:我今天偶然发现了一篇支持您观点的相关文章: