为什么park / unpark有60%的CPU使用率?
最近,我们开始使用YJP 11.0.9对我们的应用程序(基于XMPP的聊天服务器)进行压力测试。 在我们的测试期间,我们发现了以下奇怪
- 采样显示sun.misc.Unsafe.unpark(Object)占用了60%的CPU。
- 对于同一个应用程序跟踪显示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
来找出切换的原因例如,线程正在从套接字中读取小块并关闭,在这种情况下增加套接字缓冲区可能会有所帮助。
对于某些低级别阻塞命令(如读/写/驻留/锁定),“CPU”时间被过度估计,因为它假设在实际操作阻塞时它正在消耗CPU。 事实上unpark / park都很高,这表明你有问题,但我怀疑你应该把两个百分比中的较低者作为估计。