我正在调查一个持续的 CPU 使用问题,在使用一段时间后它会变高。我在其中一个节点上收到负载高的警报,我打开 Java Mission Control 并快速记录了飞行记录。
我附上我看到的输出。我不是开发人员,所以我需要帮助来理解我所看到的。
我正在查看线程锁,看到 3 个线程被锁定。我打开堆栈跟踪并看到一个数字 Request/Response 、 Socket 等条目。
知道这意味着什么吗?
我正在调查一个持续的 CPU 使用问题,在使用一段时间后它会变高。我在其中一个节点上收到负载高的警报,我打开 Java Mission Control 并快速记录了飞行记录。
我附上我看到的输出。我不是开发人员,所以我需要帮助来理解我所看到的。
我正在查看线程锁,看到 3 个线程被锁定。我打开堆栈跟踪并看到一个数字 Request/Response 、 Socket 等条目。
知道这意味着什么吗?
您显示的图像没有显示三个锁定的线程,而是显示了三个竞争最激烈的锁的对象。有关您正在查看的页面上的各个部分的含义的一般开发人员友好描述,请参阅此页面上的文档。
现在,既然你说你不是开发人员,让我为你分解一下:
对象成为锁是什么意思?
这是一个java的东西。Java 已经建立了基于监视器概念的多线程锁定方案。基本上,该语言中的任何对象都可以用作锁,这样当线程执行如下代码时:
synchronized(myObject){
//code
}
在//code
执行时,不能//other code
在块中执行其他线程,例如:
synchronized(myObject){
//other code
}
(假设 myObject 每次都引用同一个实际对象)。
锁被争用是什么意思?
假设线程 A 当前正在执行//code
上面的示例(假设它需要一些非零时间),并且线程 B 到达了它想要尝试执行的位置//other code
。由于语言设置为不能同时执行这两部分代码(称为互斥,线程 b将不得不坐下来等待执行//other code
直到//code
完成。发生这种情况时,我们说锁为争。myObject
_
我看到的 3 个课程是什么?
这些是充当锁的 3 个对象的类,它们因等待它们的线程而导致最大的延迟。
我看到的堆栈跟踪是什么?
这是到其中一个线程花费最多时间等待的位置之一的堆栈跟踪。
并且可能是您最关心的问题:此配置文件中的信息是否表明存在性能问题?
这取决于您的飞行记录被记录了多长时间,但我的意见(考虑到我不知道您的申请的任何细节,请持保留态度)可能会让人印象深刻,但不一定。等待竞争最多的锁的总时间略多于 3 秒,平均等待时间为 1.5 秒。这听起来可能不是很多(如果等待发生在相对不重要的线程上,实际上可能不会很多),但对于代码来说,1.5 秒的等待可能很多。考虑到这一点,用户界面响应性的准则是操作必须花费不到 0.1 秒的时间让用户不会注意到,并且不到 1 秒的时间让他们的思路不被打断. 如果您等待该锁发生在管理您的用户界面的线程上,则用户会注意到延迟。
作为非开发人员,我对您的最佳建议是通过查看java.lang.ref.ReferenceQueue$Lock
对象来获取您收到的堆栈跟踪,并将其发送给您项目的开发人员以进一步检查。
此外,您提到 CPU 负载问题引发了这项调查,因此:争用锁会导致高 CPU 负载吗?
不会。当锁被争用时,一个或多个线程正在等待,这意味着它们不会使用 CPU。事实上,锁争用可能导致问题的迹象之一是您的 CPU 负载异常低(尤其是在多核机器上)。您的高 CPU 使用率可能在您的分析结果中的其他地方。要调查高 CPU 使用率,您应该尝试方法热点或类似的东西。如果你有一个训练有素的开发人员和你一起看它,它可能会大大提高生产力。
像许多程序一样,他们花费大量时间进行日志记录。在这种情况下,您的程序花费大量时间写入它的控制台,我想它被重定向到一个文件。你写的越多,花费的时间就越长。尤其是如果您的磁盘子系统成为瓶颈。如果日志要显示在某处的屏幕上,它可能会变慢,具体取决于该计算机正在执行的操作。