加快建设乡镇招商网站,适合穷人开的小店,要找人做公司网站应该怎么做,一家只做t恤的网站最近看了一下部署后台的服务器状况#xff0c;发现我的一个Java程序其占用的CPU时长超过100%#xff0c;排查后发现竟是Disruptor引起的#xff0c;让我们来看看究竟为什么Disruptor会有这样的表现。
发现占用CPU时间超过100%的进程
首先是在服务器上用top命令查看服务器状…最近看了一下部署后台的服务器状况发现我的一个Java程序其占用的CPU时长超过100%排查后发现竟是Disruptor引起的让我们来看看究竟为什么Disruptor会有这样的表现。
发现占用CPU时间超过100%的进程
首先是在服务器上用top命令查看服务器状态发现有一个应用程序占用的CPU时长超过100%如图 我根据进程号查了一下发现是我的一个Java游戏后台服务有一个CPU几乎被占满因此继续排查究竟是什么代码导致了这种情况。
用top -Hp 27538将这个进程的所有线程显示出来按照CPU占用时间排序看到了这个结果 27658线程占用了近乎所有的CPU时间而且一直都是因此查看这个进程的详细信息。
用jstack pid pid.log命令将该进程的进程快照输出到一个文件中下载下来。 将27658转换为16进制0x6c0a后在线程快照中查询(因为线程快照中线程ID都是16进制存放所以需要转换)
disruptor-0 #27 prio5 os_prio0 tid0x00007fa100c58000 nid0x6c0a runnable [0x00007fa0ae080000]java.lang.Thread.State: RUNNABLEat 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的一个堆栈为了更直观地查看线程的状态信息
分析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%了