2

ThreadPoolexecutor をレガシー Thread に置き換えて使用しています。

以下のようにエグゼキュータを作成しました。

pool = new ThreadPoolExecutor(coreSize, size, 0L, TimeUnit.MILLISECONDS,
       new LinkedBlockingQueue<Runnable>(coreSize),
       new CustomThreadFactory(name),
       new CustomRejectionExecutionHandler());
pool.prestartAllCoreThreads();

ここで、コア サイズは maxpoolsize/5 です。アプリケーションの起動時に、約 160 スレッドのすべてのコア スレッドを事前に開始しました。

従来の設計では、約 670 のスレッドを作成して開始していました。

しかし要点は、Executor を使用し、レガシー設計を作成して置き換えた後でも、それほど良い結果が得られないということです。

結果のメモリ管理では、top コマンドを使用してメモリ使用量を確認しています。時間については、使用状況を確認するために System.currentTime のロガーをミリ単位で配置しました。

このデザインを最適化する方法を教えてください。ありがとう。

4

2 に答える 2

3

しかし要点は、Executor を使用し、レガシー設計を作成して置き換えた後でも、それほど良い結果が得られないということです。

アプリケーションからの全体的なスループットを見ていて、各タスクを独自のスレッドで実行するのとは対照的に、パフォーマンスが向上していないと仮定しています。つまり、プールではありませんか?

これは、コンテキストの切り替えが原因でブロックされていないようです。アプリケーションが IO バインドされているか、他のシステム リソースを待機している可能性があります。670 個のスレッドは多くのように聞こえますが、多くのスレッド スタック メモリを使用していたはずですが、それ以外の場合は、アプリケーションのパフォーマンスを妨げていなかった可能性があります。

通常、これらのクラスを使用するのは、生のスレッドよりも高速ExecutorServiceだからというわけではありませんが、コードが管理しやすいからです。並行クラスは、多くのロック、キューイングなどを処理します。

カップル コード コメント:

  • LinkedBlockingQueueをコアサイズで制限したいのかどうかわかりません。それらは 2 つの異なる数値です。core-size は、プール内のスレッドの最小数です。のサイズはBlockingQueue、空きスレッドを待機してキューに入れることができるジョブの数です。

  • 余談ですが、がいっぱいでない限り、はThreadPoolExecutorコア スレッド番号を超えてスレッドを割り当てることはありません。あなたの場合、すべてのコアスレッドがビジーで、コアサイズのキューに入れられたタスクの数でキューがいっぱいになると、次のスレッドがフォークされます。BlockingQueue

  • 使用する必要はありませんでしたpool.prestartAllCoreThreads();。タスクがプールにサブミットされると、コア スレッドが開始されるため、少なくとも実行時間の長いアプリケーションでは、あまりメリットがないと思います。

時間については、System.currentTime のロガーをミリ単位で配置して、使用状況を確認しました。

これには注意してください。ロガーが多すぎると、アプリケーションの再設計以上にアプリケーションのパフォーマンスに影響を与える可能性があります。しかし、パフォーマンスの向上が見られなかったにロガーを追加したと思います。

于 2013-10-04T16:02:09.347 に答える
0

エグゼキューターは、スレッドの作成/使用をラップするだけなので、魔法のようなことは何もしていません。

他の場所でボトルネックがあるようです。単一のオブジェクトをロックしていますか? すべてのスレッドがヒットする単一のシングルスレッド リソースはありますか? そのような場合、行動に変化は見られません。

あなたのプロセスはCPUバウンドですか?その場合、スレッドは (非常に大まかに言えば) 利用可能な処理コアの数と一致する必要があります。作成する各スレッドは、そのスタックのメモリを消費することに注意してください。メモリに制約がある場合は、複数のスレッドを作成しても役に立ちません。

于 2013-10-04T16:02:26.347 に答える