0

私たちのマルチスレッド Java アプリでは、スレッドごとに LinkedBlockingDeque の個別のインスタンスを使用しています。スレッド (c1、c2、.... c200) を想定しています。

スレッド T1 と T2 はソケットからデータを受信し、c1 から c200 の間の特定のコンシューマーの Q にオブジェクトを追加します。

LinkedBlockingDeque.take() を呼び出す run() 内の無限ループ

負荷実行では、javae.exe 自体の CPU 使用率は 40% です。システム内の他のプロセスを合計すると、全体の CPU 使用率は 90% に達します。

JavaVisualVM を使用することにより、run() はより多くの CPU を使用しており、LinkedBlockingDeque.take() を疑っています。

そのため、thread.wait、notify、thread.sleep(0) などの代替手段を試しましたが、変更はありませんでした。

各コンシューマーが別々の Q を持つ理由は 2 つあります。と検索条件が拡張されます。3.そして、コンシューマにリクエストを処理するための別の Q を持たせる

CPU 使用率を下げようとしていて、入力が必要です...

SD

4

1 に答える 1

0
  1. プロファイリングを行い、キュー メソッドが比較的多くの CPU 時間を消費することを確認します。あなたのメッセージ処理は、キューへの/からの書き込み/取得と比較して非常に単純ですか? 1 秒あたりに処理されるメッセージの数は? CPUはいくつありますか?各 CPU が 1 秒あたり 100K 未満のメッセージを処理している場合、その理由はキューへのアクセスではなく、メッセージ処理そのものである可能性があります。

  2. LinkedBlockingDeque を入れると、ヘルパー オブジェクトのインスタンスが作成されます。そして、新しいメッセージはそれぞれヒープから割り当てられるので、メッセージごとに2つの作成があると思います。事前に割り当てられたメッセージのプールと循環バッファーを使用してみてください。

  3. 200 スレッドは多すぎます。これは、コンテキストの切り替えが多すぎることを意味します。https://github.com/rfqu/df4jなどのアクター ライブラリとスレッド プールを使用してみてください(はい、私のものです)。

  4. http://code.google.com/p/disruptor/がニーズに合っているかどうかを確認してください。

于 2012-07-11T08:56:17.903 に答える