log4j2(2.5)とKafka(0.10.1.0)の組み合わせでパフォーマンスの問題が発生しています。私がlog4j2.xmlファイルでKafkaを有効にすると、アプリケーションはクロールまで遅くなり、Kafkaブローカには約200KB /秒のイベントしか出力されません。これは、カフカが達成しようとしているものよりも桁違いに小さい(https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines)。私は問題を突き止めることができたとカフカに同梱されてProducerPerformanceテストが達成しないことがわかってきたいくつかのテストを実行した後Kafkaと組み合わせたlog4j2のパフォーマンスが低い
<Kafka name="KafkaAll" topic="all">
<PatternLayout pattern="%date %message" />
<Property name="bootstrap.servers">localhost:9092</Property>
<Property name="buffer.memory">67108864</Property>
<Property name="batch.size">8196</Property>
<Property name="acks">1</Property>
</Kafka>
:ここ
は、関連する私のlog4j2.xmlの設定ファイルの一部です。まともなパフォーマンス。その性能は約5MB/sで、同様のサイズの100バイトのメッセージがあります。広範なテストの後、私は違いが構成にあるのではなく、呼び出しが実装される方法であることに気付きました。 log4j2 KafkaAppenderはカフカにログの書き込みにKafkaManagerクラスを使用します。public void send(final byte[] msg) throws ExecutionException, InterruptedException, TimeoutException {
if (producer != null) {
producer.send(new ProducerRecord<byte[], byte[]>(topic, msg)).get(timeoutMillis, TimeUnit.MILLISECONDS);
}
}
パフォーマンスの問題は、送信が完了するまでブロック「GET」メソッドの呼び出しによって引き起こされます。十分おかしい、アカウントにこの問題を取るんカフカに含まれているのlog4jアペンダがあります:syncSendがfalseに設定されている場合、つまり
Future<RecordMetadata> response = producer.send(new ProducerRecord<byte[], byte[]>(topic, message.getBytes()));
if (syncSend) {
try {
response.get();
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
} catch (ExecutionException ex) {
throw new RuntimeException(ex);
}
}
は、呼び出しはすぐにリターンを送信します。しかし、この "syncSend"プロパティは、KafkaAppenderのlog4j2実装では見つけられません。
私は、log4j2に付属のAsyncAppenderを使用し、acksプロパティを1ではなく0に設定するなど、他の方法で非同期呼び出しを試みました。しかし、いずれの設定も送信を待たずにパフォーマンスを向上させるものはありません完了する。私はKafkaに同梱されているlog4jアペンダーも使用しようとしましたが、log4j2で動作させることはできませんでした(そして私はlog4j2に固執したい)。
最後に、log4j2に付属のKafkaAppenderをフォークし、呼び出しのブロック部分を削除することにしました。これは機能しますが、もちろん、私はむしろ既製のパッケージを使用しています。
誰もこの問題に遭遇しましたか?どのように問題を解決しましたか?コードを変更せずに簡単な方法がありますか?
AsyncAppenderではなくAsyncLoggerを使用してみましたか? – Matt
はい、私はAsyncAppenderでKafkaAppenderをラップしようとしましたが、これはKafkaとの通信を高速化しません。これは、アプリケーションがKafkaに送信されるメッセージよりも速く実行されるだけですが、最終的にキューがいっぱいになるとブロックされます。 – thedutchy
あなたは正しいことをして、この問題をLog4j2コミュニティ(https://issues.apache.org/jira/browse/LOG4J2-1733)に提出しました。 Log4jに対する改善と提案はいつでも歓迎します!あなたの改善を得るための最も速い方法は、ユニットテストでパッチまたはプルリクエストを提供することです。 –