テキストファイルを読み込んでデータベースに挿入しようとしていますDisruptor
.
しかし、CPU 使用率が高すぎることがわかりました (top
コマンドによると 200%)。
パフォーマンス チューニングとスレッド ダンプ分析は初めてです。何が問題なのかわかりません。
そこでtop -H
、2 つの最も高いスレッド (両方とも 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)
基本的に、これら 2 つのスレッドはデータを Disruptor にパブリッシュします。私はこのように作成Disruptor
します:
Disruptor<TradeEvent> disruptor = new Disruptor<TradeEvent>(TradeEvent.TRADE_EVENT_FACTORY,
properties.dbRingbufferSize(), Executors.newCachedThreadPool(),
ProducerType.SINGLE, new BlockingWaitStrategy());
スレッド ダンプを分析して、高い CPU 使用率の根本原因を見つけてください。