2017-09-07 4 views
2

Ich bin Benchmark-Warteschlange für einen unserer Anwendungsfälle und bemerkte, dass readDocument() API des ExcerptTailer erstellt zu viel Müll! JFR zeigt, dass der Prozess etwa 66% der Zeit im darunter liegenden Stapel verbringt.Chronicle Queue StoreTailer.next() Erstellen riesiger Müll

Welche Version von Chronicle Queue verwende ich?

net.openhft: Chronik-Warteschlange: 4.5.9

Wie erschaffe ich die Warteschlange?

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

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

     }); 

Wie viel Müll erstellt?

Rund 11 GB 3 Minuten

Stacktrace

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 

Was hat versuche ich?

Ich habe JitWatch verwendet und die Bytecode-Größe für die Escape-Analyse von 150 Byte auf 516 Byte erhöht. Ich habe festgestellt, dass die readDocument-Methode JIT-kompiliert ist.

Irgendwelche Vorschläge für den nächsten Schritt?

Antwort

2

Dies geschieht nur, wenn das Polling besetzt ist und keine Nachrichten vorliegen. Sie können eine Dummy-Nachricht hinzufügen, um dies zu verhindern. Eine Problemumgehung wurde zu späteren Versionen hinzugefügt.

+1

Danke, Peter. Das habe ich getan. Übrigens, tolles Stück Software! – KodeWarrior

+1

Eines der Dinge, die noch immer ein Rätsel sind, ist, warum Variablen nicht durch Fluchtanalyse eliminiert wurden. – KodeWarrior

+0

@KodeWarrior AFAIK Arrays werden nicht auf den Stapel gelegt, und selbst wenn sie dies tun, wird alles, auf das sie zeigen, nicht auf den Stapel gelegt. –