为什么park / unpark有60%的CPU使用率?

最近,我们开始使用YJP 11.0.9对我们的应用程序(基于XMPP的聊天服务器)进行压力测试。 在我们的测试期间,我们发现了以下奇怪

  1. 采样显示sun.misc.Unsafe.unpark(Object)占用了60%的CPU。
  2. 对于同一个应用程序跟踪显示LockSupport.park(Object)占用了52%的CPU。

我做了多次测试以确认结果,每次我得到类似的结果。

我无法理解为什么unpark应该花费60%的时间以及为什么跟踪显示完全相反的结果。

有人可以帮助我理解这些结果。 我在这里错过了什么吗?

环境:

  java -version
 java版“1.6.0_31”
 Java(TM)SE运行时环境(版本1.6.0_31-b04)
 Java HotSpot(TM)64位服务器VM(内置20.6-b01,混合模式) 

Unsafe.unpark高CPU时间是过度上下文切换的标志。 这篇文章是关于上下文切换有多昂贵的想法:

上下文切换需要多长时间?

在Linux上查找CS计数的最简单选项是运行vmstat

一旦确认了高CS(例如每个核心/每秒更多10K交换机),你就会接受有问题的线程(你可以按照它们的CPU时间对YJP中的线程进行排序)并运行strace -p -c来找出切换的原因例如,线程正在从套接字中读取小块并关闭,在这种情况下增加套接字缓冲区可能会有所帮助。

对于某些低级别阻塞命令(如读/写/驻留/锁定),“CPU”时间被过度估计,因为它假设在实际操作阻塞时它正在消耗CPU。 事实上unpark / park都很高,这表明你有问题,但我怀疑你应该把两个百分比中的较低者作为估计。