我正在尝试读取文本文件并使用Disruptor
.
但是我发现CPU使用率太高了(200%,根据top
命令)。
我是性能调优和线程转储分析的新手。我不知道出了什么问题。
所以我执行top -H
并找到两个最高的线程(都是 99%),并找到线程转储:
"main" prio=10 tid=0x00007f54a4006800 nid=0x79ab runnable [0x00007f54a8340000]
java.lang.Thread.State: RUNNABLE
at java.lang.Thread.yield(Native Method)
at com.lmax.disruptor.SingleProducerSequencer.next(SingleProducerSequencer.java:104)
at com.lmax.disruptor.SingleProducerSequencer.next(SingleProducerSequencer.java:79)
at com.lmax.disruptor.RingBuffer.next(RingBuffer.java:207)
at com.xxx.xxx.connectivity.quickfixj.FixMessageReceiver.onMessage(FixMessageReceiver.java:105)
at com.xxx.xxx.database.DatabaseService.start(DatabaseService.java:110)
at com.xxx.xxx.database.DatabaseService.main(DatabaseService.java:168)
"pool-2-thread-1" prio=10 tid=0x00007f54a426d800 nid=0x79bc runnable [0x00007f5492a37000]
java.lang.Thread.State: RUNNABLE
at java.lang.Thread.yield(Native Method)
at com.lmax.disruptor.SingleProducerSequencer.next(SingleProducerSequencer.java:104)
at com.lmax.disruptor.SingleProducerSequencer.next(SingleProducerSequencer.java:79)
at com.lmax.disruptor.RingBuffer.next(RingBuffer.java:207)
at com.cimb.reporting.connectivity.jms.DatabaseEventHandler.publish2DbRingBuffer(DatabaseEventHandler.java:49)
at com.xxx.xxx.connectivity.jms.DatabaseEventHandler.onEvent(DatabaseEventHandler.java:39)
at com.xxx.xxx.connectivity.jms.DatabaseEventHandler.onEvent(DatabaseEventHandler.java:15)
at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:133)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
基本上这两个线程会将数据发布到 Disruptor。我Disruptor
以这种方式创建:
Disruptor<TradeEvent> disruptor = new Disruptor<TradeEvent>(TradeEvent.TRADE_EVENT_FACTORY,
properties.dbRingbufferSize(), Executors.newCachedThreadPool(),
ProducerType.SINGLE, new BlockingWaitStrategy());
请帮助我并分析线程转储以找到高 CPU 使用率的根本原因。