【发布时间】:2016-10-23 07:49:50
【问题描述】:
从使用某些数据库以 Java 开发的典型 MVC/Web 应用程序的角度来看:假设应用服务器托管在一台服务器上,而数据库托管在另一台服务器上。如果我们在实时服务器(托管应用服务器)上获得高 CPU 使用率/缓慢,那么我们会进行线程转储并根据以下规则找出“罪魁祸首”线程:
1) 如果 SQL 运行缓慢(从 Web 应用程序中触发)/数据库很慢,那么它永远不会导致服务器托管应用程序服务器具有高 CPU 使用率。数据库缓慢只会使应用程序变慢。数据库运行缓慢会导致应用程序线程处于 BLOCKED/WAITING 状态,因为这些线程“竞争/竞争”以获得“有限”数据库访问(典型的连接池内容)。
2) 罪魁祸首始终是线程(处于 RUNNABLE 状态)在应用服务器层上执行某些活动,例如在相当长的 while 循环中运行和/或执行一些密集的操作/计算。
任何人都可以帮助验证上述理解吗?
【问题讨论】:
-
正确,
BLOCKED,WAITING或TIMED_WAITING不消耗 CPU,因此您应该查看那些RUNNABLE。 -
@JohnVint 我的问题不在于可能导致高 CPU 的“线程状态”(在服务器托管应用程序服务器上)。围绕着应用程序与数据库——谁杀死了 CPU?
-
如果数据库在另一台服务器上(我希望它在),那么在数据库上进行的处理将不会影响您的 CPU。该请求将在被阻塞等待的
socketRead上。换句话说,DB工作不会导致你的CPU增加。
标签: java multithreading performance production-environment thread-dump