問題タブ [disruptor-pattern]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
disruptor-pattern - アプリケーション内のディスラプターの最大数
LMAX ディスラプターを使用して、アプリケーションで 5 ~ 10 個のディスラプターを一緒に使用した場合 (すべてのディスラプターが 1 つのコンシューマーを持ち、指定されたタスクを実行し、メッセージを次のディスラプターに引き渡すような、一連のディスラプターのようなもの) を観察しました。 / ringbuffer)、CPU 使用率が 90% 以上に達し、アプリケーションを停止するまでシステムが応答しなくなります。これは、アクティブなディスラプター スレッドが非常に多いためだと感じています。これは、ディスラプターが実際には何も処理していない場合でも発生します。アプリケーションで使用するディスラプターの最適な数について、誰かコメントできますか?
java - Java でのオブジェクトのシリアル化と圧縮のパフォーマンス コスト
Report
アプリケーションは、指定されたオブジェクトを受け取り続け、オブジェクトDisruptor
を 3 つの異なるコンシューマーに配置します。
Eclipse メモリ分析の助けを借りて、各Report
オブジェクトの保持ヒープ サイズは平均 20KB です。アプリケーションは で始まり、アプリケーション-Xmx2048
のヒープ サイズが 2GB であることを示します。
ただし、オブジェクトの数は一度に約 100,000 であるため、すべてのオブジェクトの合計サイズは約 2GB になります。
Disruptor
要件は、コンシューマがデータを非同期的に消費できるように、100,000 個のオブジェクトすべてをロードする必要があることです。ただし、各オブジェクトのサイズが 20KB にも及ぶ場合は不可能です。
String
だから私はオブジェクトをシリアライズして圧縮したいと思います:
の後compress(toBytes(Report))
、オブジェクト サイズは小さくなります。
圧縮前
圧縮後
現在、オブジェクトの文字列は約 6KB です。今は良くなっています。
これが私の質問です:
サイズが文字列より小さい他のデータ形式はありますか?
シリアル化と圧縮を毎回呼び出すと
ByteArrayOutputStream
、 などのオブジェクトが作成ObjectOutputStream
されます。のような多くのオブジェクトを作成したくありません。100,000 回反復する必要があるためByteArrayOutputStream
です。ObjectOutputStream
ByteArrayOutputStream
ObjectOutputStream
コンシューマーは、から文字列をデシリアライズして解凍する必要があり
Disruptor
ます。コンシューマーが 3 人いる場合、逆シリアル化と解凍を 3 回行う必要があります。どうでもいい?
アップデート:
@BoristheSpider が示唆したように、シリアル化と圧縮は 1 つのアクションで実行する必要があります。
java - ディスラプター コンシューマーが期待どおりに機能しない
このコードを実行すると
私はこの出力を得ています
しかし、私は各イベントが別々のスレッドによって一度だけ処理されることを期待していました。どうすれば実現できますか?
java - Netty を Disruptor でパフォーマンス的に使用する意味はありますか?
複数のクライアントからの着信 protobuf/protostuff メッセージを消費し、それらに対していくつかのビジネス ロジックを実行し、場合によっては他のコンシューマーにファイア アンド フォーゲット メッセージを送信する単純なリアクティブ サーバーを構築しています。Netty でトランスポートとデコードの部分を実装したいと考えています。私の質問は次のとおりです。デコードされたメッセージを Disruptor のリング バッファーにパブリッシュすることに意味はありますか? それとも、Disruptor によって提供される追加のパフォーマンスが内部の Netty スケジューリングによって無効にされますか? Netty に 2 つのスレッド (「受け入れ」グループ用と「接続」グループ用) を提供する必要がありますか? たぶん、Netty のハンドラーで長さフィールドごとにメッセージを分割し、Disruptor のハンドラーでデコードを実行する必要がありますか?
performance - LMAX のディスラプター パターンで 6M TPS はどのようにカウント/測定されますか?
この数は IO 操作に影響しますか? それとも、アーキテクチャがメモリへの/からの読み取りと書き込みのみに対応できるトランザクションの数ですか?
テスト中に使用したハードウェアは? おそらく問題ではありませんが、彼らはどのOSを使用していましたか?