これらのことは、徹底的に分析して良い提案をするには、明らかに検査とコードの入手が必要です。それにもかかわらず、それは常に可能ではありません、私は以下の情報に基づいて良いヒントを私に提供することが可能であることを願っています。Javaメモリ使用量/スレッドプールパフォーマンスの問題
リスナースレッドを使用して着信データを受信するサーバーアプリケーションがあります。入力データはアプリケーション固有のメッセージに解釈され、これらのメッセージはイベントを発生させます。
これまでのところ、私は物事がどのように行われているかについて何の支配もしていません。
これは従来のアプリケーションであるため、これらのイベントは以前は同じリスナースレッド(主にシングルスレッドアプリケーション)によって処理されていました。イベントはブラックボックスに送られ、結果はディスクに書き出されます。
スループットを向上させるために、スレッドプールを使用してイベントを処理したいと考えました。イベントが作成され、スレッドがブラックボックス呼び出しを処理するたびに、リスナースレッドが新しいタスクを生成できるという考えがあります。最後に、ディスクへの書き込みを実行するバックグラウンドスレッドがあります。
以前のセットアップとバックグラウンドライターだけで、すべて正常に動作し、スループットは従来の1.6倍になりました。
スレッドプールを追加するとパフォーマンスは低下します。最初はすべてがスムーズに動くようですが、しばらくするとすべてが非常に遅くなり、最終的に私はOutOfMemoryExceptionsを取得します。変わったことは、タスクがプールに追加されるたびにアクティブなスレッドの数を表示すると(キューに登録されているタスクの数などの情報とともに)、スレッドプールに問題がないかのように見えるということですプロデューサ(リスナスレッド)。
先頭へ-Hを使用してCPU使用率をチェックすると、最初は非常に均等に広がっていますが、最後にワーカースレッドはほとんどアクティブでなく、リスナースレッドだけがアクティブです。しかし、それ以上のタスクを提出するようではありません...
誰もこれらの症状の理由を仮定することはできますか?複数のスレッドが追加されたときにうまくいかない、レガシーコードに何かがある(私が制御できない)可能性が高いと思いますか?メモリ不足の問題は、どこかのキューが大きくなりすぎるためですが、スレッドプールにはキューに入れられたタスクがほとんど含まれていないので、それはできません。
アイデアを歓迎します。このような状況をより効率的に診断する方法のアイデアが特にあります。私のスレッドが何をしているのかについて、より良いプロファイルを得るにはどうすればいいですか?
ありがとう。
ブラックボックスは端末コンポーネントですか、接続されていますか?それはパッシブまたはアクティブなコンポーネントですか?あなたのスレッドプールはどこにありますか? – alphazero
ブラックボックスの詳細を教えてください。 – toto2
blackboxは、タイプAのオブジェクトを受け取り、さまざまな操作を実行してタイプBのオブジェクトを生成する内部関数です。これは、アプリケーションの計算部分であり、プール内のスレッドが実行するものです。スレッドプールは標準のoracle/sun jdk実装です。 – UmaN