【发布时间】:2012-10-09 23:44:50
【问题描述】:
最近我们开始使用 YJP 11.0.9 对我们的应用程序(基于 XMPP 的聊天服务器)进行压力测试。在我们的测试中,我们注意到以下奇怪的行为。
- 采样显示 sun.misc.Unsafe.unpark(Object) 占用了 60% 的 CPU。
- 对于同一个应用程序跟踪显示 LockSupport.park(Object) 占用了 52% 的 CPU。
我做了多次测试来确认结果,每次都得到类似的结果。
我无法理解为什么 unpark 需要 60% 的时间,以及为什么跟踪显示完全相反的结果。
谁能帮我理解这些结果。我在这里遗漏了什么吗?
环境:
java -版本 java版本“1.6.0_31” Java(TM) SE 运行时环境 (build 1.6.0_31-b04) Java HotSpot(TM) 64 位服务器 VM(内部版本 20.6-b01,混合模式)
【问题讨论】:
-
如果调用
unpark几乎是线程唯一做的事情,那么它可能需要这么多。 “跟踪显示完全相反的结果”是什么意思?跟踪是否可能测量在方法中花费的时间?park是一种阻塞方法,难怪在其中花费时间。 -
@MarkoTopolnik 线程还可以做其他事情。基本上它的生产者/消费者问题。生产生产任务并将其提交到队列中并通知等待的消费者。消费者对任务采取行动,如果没有可用的任务,则自行停放。
-
调用
unpark的线程不是被解除停放的线程。反过来,该线程可能实际上只做很少的工作,除了取消驻留适当的消费者线程。至于park的 CPU 时间,a) 由于阻塞而难以测量,并且 b) 无关紧要,因为它只是在停放状态下实际花费的时间的一小部分。 -
@MarkoTopolnik 在 Sampling 测试中 60% 的 CPU 用于执行 unpark consumer。在跟踪测试中,52% 的 CPU 用于从消费者线程进行停放。
-
@MarkoTopolnik 正如我所说,生产者会进行诸如 xml 解析之类的 CPU 活动,这应该比 unpark 高得多。