Java服务器-Disruptor使用注意

Posted death00

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java服务器-Disruptor使用注意相关的知识,希望对你有一定的参考价值。

最近看了一下部署游戏后台的服务器状况,发现我的一个Java程序其占用的CPU时长超过100%,排查后发现竟是Disruptor引起的,让我们来看看究竟为什么Disruptor会有这样的表现。 ## 发现占用CPU时间超过100%的进程 首先是在服务器上用top命令查看服务器状态,发现有一个应用程序占用的CPU时长超过100%,如图: ![](https://img2018.cnblogs.com/blog/1434259/201909/1434259-20190909141500529-1294141398.png) 我根据进程号查了一下,发现是我的一个Java游戏后台服务,有一个CPU几乎被占满,因此继续排查究竟是什么代码导致了这种情况。 用`top -Hp 27538`将这个进程的所有线程显示出来,按照CPU占用时间排序,看到了这个结果: ![](https://img2018.cnblogs.com/blog/1434259/201909/1434259-20190909141502852-2002225095.png) 27658线程占用了近乎所有的CPU时间,而且一直都是,因此查看这个进程的详细信息。 用`jstack pid > pid.log`命令将该进程的进程快照输出到一个文件中,下载下来。 将27658转换为16进制0x6c0a后在线程快照中查询(因为线程快照中线程ID都是16进制存放,所以需要转换): ``` "disruptor-0" #27 prio=5 os_prio=0 tid=0x00007fa100c58000 nid=0x6c0a runnable [0x00007fa0ae080000] java.lang.Thread.State: RUNNABLE at com.lmax.disruptor.BusySpinWaitStrategy.waitFor(BusySpinWaitStrategy.java:39) at com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(ProcessingSequenceBarrier.java:56) at com.lmax.disruptor.BatchEventProcessor.processEvents(BatchEventProcessor.java:159) at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:125) at java.lang.Thread.run(Thread.java:748) ``` 这是Disruptor的一个堆栈,为了更直观地查看线程的状态信息,可以将快照上传到专门的[分析平台上](http://fastthread.io/)。 (博主本人对于进程快照分析也是处于新手阶段,如果大家有什么建议或者意见,欢迎在下方留言。) ## 分析Disruptor为何会占用整个CPU 根据上面快照的分析,实际是Disruptor的等待策略相关的线程所导致的,查看`BusySpinWaitStrategy`类,发现有相关说明: ``` * This strategy will use CPU resource to avoid syscalls which can introduce latency jitter. It is best * used when threads can be bound to specific CPU cores. ``` 现在终于知道了,原来是因为这个策略就是让线程绑定了一个CPU核心,自然其CPU占用时间就超过100%了。 ## 总结 通过这一次问题的排查,不仅了解了linux系统中进程、线程的关系,也开始着手java服务的线上排查,顺便也回顾了一下之前有过接触的Disruptor。如果大家有什么建议或者意见,欢迎在下方留言。 有兴趣的话可以关注我的公众号,说不定会有意外的惊喜。 ![在这里插入图片描述](https://img2018.cnblogs.com/blog/1434259/201909/1434259-20190909141503082-1033078959.jpg)

以上是关于Java服务器-Disruptor使用注意的主要内容,如果未能解决你的问题,请参考以下文章

《重学Java高并发》Disruptor使用实战

《重学Java高并发》Disruptor使用实战

Log4j2 - java.lang.NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor

Java 无锁队列 Disruptor,内存队列的生产解决方案

Java并发编程框架Disruptor

Java&Go高性能队列之Disruptor性能测试#yyds干货盘点#