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

Kal*_*tel 6 java profiling yourkit

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

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

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

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

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

环境:

java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

Iva*_*hov 5

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

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

找到在Linux上查找CS计数的最简单方法就是运行vmstat <seconds>.

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


Pet*_*rey 3

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