【问题标题】:Thread dump analysis when live server has high CPU usage实时服务器 CPU 使用率高时的线程转储分析
【发布时间】:2016-10-23 07:49:50
【问题描述】:

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

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

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

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

【问题讨论】:

  • 正确,BLOCKEDWAITINGTIMED_WAITING 不消耗 CPU,因此您应该查看那些 RUNNABLE
  • @JohnVint 我的问题不在于可能导致高 CPU 的“线程状态”(在服务器托管应用程序服务器上)。围绕着应用程序与数据库——谁杀死了 CPU?
  • 如果数据库在另一台服务器上(我希望它在),那么在数据库上进行的处理将不会影响您的 CPU。该请求将在被阻塞等待的socketRead 上。换句话说,DB工作不会导致你的CPU增加。

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


【解决方案1】:

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

确实,让许多应用服务器线程处于 RUNNABLE 状态会导致 CPU 使用率高,但这并不是总是导致 CPU 使用率高的原因。

当应用服务器 JVM 内存不足(和/或应用正在生成大量垃圾)并且 JVM 在垃圾收集上花费过多精力 (CPU) 时,会发生另一种主要选择。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-02-12
  • 2014-07-13
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多