2017-12-24 5 views
1

私のコードをデバッグしています。スレッドが次のlog4j TextEncoderHelperでブロックされています。私はlog4jを使用しています2.8.2TextEncoderHelperでスレッドがブロックされましたcopyDataToDestination

私のスレッドは実行できず、基本的にアプリケーション全体をブロックしました。

誰でも次のことを知っていますか?私は2つのスレッドのログを持っている場合、それはデッドロックを意味するのでしょうか?

(私はパラメータを指定して実行しているよ

-DLog4jContextSelector = org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -DAsyncLogger.RingBufferSize = 32768 * 32768 -DAsyncLogger.WaitStrategy =スリープ-Dlog4j2.AsyncQueueFullPolicy =デバッガは、アプリケーションが根底にあるアペンダへの書き込みしようとしてブロックされて表示されている場合、おそらく根本的なアペンダは、ワークロードに追いつくことはできません)

private static void copyDataToDestination(final ByteBuffer temp, final ByteBufferDestination destination) { 
61   synchronized (destination) { 
62    ByteBuffer destinationBuffer = destination.getByteBuffer(); 
63    if (destinationBuffer != temp) { // still need to write to the destination 
64     temp.flip(); 
65     if (temp.remaining() > destinationBuffer.remaining()) { 
66      destinationBuffer = destination.drain(destinationBuffer); 
67     } 
68     destinationBuffer.put(temp); 
69     temp.clear(); 
70    } 
71   } 
72  } 
+0

デバッガの外で動作しているときにスタックダンプを実行して結果を表示できますか?または、Log4j2のissueトラッカーでJIRAチケットを開いて、スレッドダンプ結果を表示します。 –

+0

私はこれを見ました https://issues.apache.org/jira/browse/LOG4J2-1874 2.10.0で試しました。 ブロックが消えましたが、asyncLoggerスレッドがflush-> writeToDestinationを呼び出すのに時間がかかりました。基本的にディスクにブロックのように書くことができる最適なリングバッファサイズは何ですか? (もしそれが長いフラッシュを避けるために遊ぶ必要がある設定なら - > writeToDestination呼び出し) – Mag

+0

あなたは、非同期ロガースレッドがフラッシュするのに長い時間がかかると思いますか?基本的に、非同期スレッドは、キューが空になるたびに自動的にフラッシュされます。デフォルトキューサイズは128 K(1K = 1024)です。 42:: –

答えて

0

を捨てます。

私は最初にファイルアペンダーを想定していたので、どのアペンダーが使用されているかについては言及していませんが、コメントからはJmsAppenderが使用されています。 (今後の質問では、このような詳細を言及してください:この情報がなければ私は間違った方向に考えていました)

JMSはそれ自体は大きな問題ですが、実現可能な実際のスループットは、実装製品とその構成によって異なります。

JMSデバッグオプションを有効にして、JMSキューが実際にボトルネックであることを確認することをお勧めします。

+0

返事ありがとうございました。私の問題はすべてここから来たと思います。https://stackoverflow.com/questions/47971267/chronicle-queue-log4j2-async-logger/47972404#47972404 – Mag

+0

これは役に立ちましたか? –

関連する問題