Linux プラットフォーム上の Java で、高度にマルチスレッド化された環境で非同期にログを記録しようとしています。スレッドの競合を少なくするための適切なデータ構造 (ロックフリー) は何でしょうか? GB 単位のメッセージをログに記録する必要があります。メインロジック(ロガーAPIを呼び出すコード)のパフォーマンスを損なわないように、非同期/ロックフリーの方法で行う必要があります。
5 に答える
Logback には、ニーズを満たす可能性のある AsyncAppender があります。
これを行う最も簡単な方法は、スレッドごとに1つずつ、複数のファイルに書き込むことです。
各レコードの先頭にタイムスタンプを付けるようにしてください。そうすれば、タイムスタンプを1つのログファイルに簡単にマージできます。
UNIXコマンドの例:
cat *.log | sort | less
しかし、より良い/より有用な答えを得るには、より多くの詳細を追加して質問を明確にする必要があります。
私はJava Chronicleを使用しますが、これは主に私が作成したためですが、最小限の OS 呼び出しでロックフリーおよびガベージフリーのログを作成できるため、ここでお勧めします。これにはスレッドごとに 1 つのログが必要ですが、これらを最小限に抑えていると思います。
このライブラリを使用して、2 つのスレッドから 1 GB/秒を書き込みました。ロギングがボトルネックである場合、より多くのスレッドを使用しても、思ったほど役に立たないことに気付くかもしれません。
ところで: 複数のスレッド/プロセスからログを更新する方法については教えていただきましたが、実装とテストにはしばらく時間がかかります。
競合を減らすために、最初に各スレッド専用のバッファにログ メッセージを入れることができます。バッファーがいっぱいになると、別のログ スレッドによって処理されるキューに入れられます。次に、別のスレッドからのメッセージがマージされ、ファイルに書き込まれます。次のバッファがディスクに書き込まれるときに作業スレッドの速度を落とさないようにするために、いずれの場合でもその別のスレッドが必要であることに注意してください。