2017-09-07 5 views
2

の膨大な量を作成する私たちのユースケースの一つとExcerptTailerのreadDocument()APIは、あまりにも多くのゴミを作成していることに気づいたためベンチマーキングクロニクルキューよ! JFRは、プロセスが以下のスタックで約66%の時間を費やしていることを示しています。私が使用していクロニクルキューのバージョンは何クロニクルキューStoreTailer.next()ごみ

net.openhft:クロニクル・キュー:4.5.9

どのようにキューを作成するのですか?

queue = SingleChronicleQueueBuilder.binary(filename).build(); 
appender = queue.acquireAppender(); 
tailer = queue.createTailer(); 

//Snippet to read 
tailer.readDocument(r -> { 
      //Reading some context here 

     }); 

どのくらいのゴミを作成していますか? 3分

ギガバイト11の周囲にスタックトレース

Stack Trace TLABs Total TLAB Size(bytes) Pressure(%) 
byte[] java.lang.StringCoding$StringEncoder.encode(char[], int, int) 167 6,593,171,600 52.656 
    byte[] java.lang.StringCoding.encode(String, char[], int, int) 167 6,593,171,600 52.656 
     byte[] java.lang.String.getBytes(String) 167 6,593,171,600 52.656 
     String[] java.io.UnixFileSystem.list(File) 167 6,593,171,600 52.656 
      String[] java.io.File.list() 167 6,593,171,600 52.656 
       String[] net.openhft.chronicle.queue.impl.single.SingleChronicleQueue.getList() 167 6,593,171,600 52.656 
        void net.openhft.chronicle.queue.impl.single.SingleChronicleQueue.setFirstAndLastCycle() 167 6,593,171,600 52.656 
        int net.openhft.chronicle.queue.impl.single.SingleChronicleQueue.firstCycle() 167 6,593,171,600 52.656 
         long net.openhft.chronicle.queue.impl.single.SingleChronicleQueue.firstIndex() 167 6,593,171,600 52.656 
          boolean net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreTailer.next(boolean) 167 6,593,171,600 52.656 

私は他に何をしようとしたのですか?

IはJitWatchを使用し、516バイト、150バイトから脱出分析のためのバイトコードサイズを増加させました。私はreadDocumentメソッドがJITコンパイルされていることに気づいた。

次の手順についてのご意見はありますか?

答えて

2

これはビジーポーリングを発生し、何もメッセージはありません。 これを防ぐためにダミーメッセージを追加することができます。 回避策がそれ以降のバージョンに追加されました。

+1

ありがとう、ピーター。それが私のやり方です。ところで、ソフトウェアの素晴らしい部分! – KodeWarrior

+1

まだ謎に包まれていることの1つは、エスケープ分析によって変数が削除されなかった理由です。 – KodeWarrior

+0

@KodeWarrior AFAIK配列はスタックに置かれず、たとえ配列されていても、ポインタが指し示すものはスタックに置かれないことがあります。 –

関連する問題