1

テキストファイルを読み込んでデータベースに挿入しようとしています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 使用率の根本原因を見つけてください。

4

4 に答える 4

2

まったく同じ問題に直面しました: 1 つのブローカー (Xmx 2G)、1 つのクライアント (Xmx2G) を備えた 16 GB のメモリを備えたマシン Intel Core i3-3220 で 100% の CPU 使用率があり、リングバッファーにメッセージがありません。

クイック プロファイリングでは、Thread.yield() が CPU の約 70 ~ 80% を消費していることがわかります。

私の場合、 YieldingWaitStrategy は適切な戦略ではないことが判明しました。したがって、私の場合、迅速な修正は、待機戦略を BlockingWaitStrategy に設定することでした。

Disruptor<MessageEvent> disruptor = new Disruptor<MessageEvent>(eventFactory, RING_BUFFER_SIZE, executor, ProducerType.SINGLE, new BlockingWaitStrategy());

アップデート

YieldingWaitStrategy の JProfiler ここに画像の説明を入力

于 2014-10-16T15:35:07.713 に答える
0

Java プロファイラーを確認する必要があります。たとえば、CPU と RAM の使用状況をリアルタイムで分析する VisualVM です。

于 2014-06-04T05:15:26.887 に答える