2017-02-28 14 views
3

ThreadPoolExecutor/ScheduledThreadPoolExecutorに渡される推奨されるcorePoolSizeは何ですか?ThreadPoolExecutor/ScheduledThreadPoolExecutorに渡される推奨されるcorePoolSizeは何ですか?

Runtime.getRuntime().availableProcessors()Runtime.getRuntime().availableProcessors() * 2

CPUのコア(すべてのコア)を100%利用することができますが、できるだけ早く終了し、あまりペナルティがないようにできるだけ小さなスレッドとして使用したいと思いますコンテキスト切り替え時に

一方、ネットワークの待機のように、スレッドの中には常にCPUを使用しないものがあります。その場合は、新しいスレッドを生成してすべてのコアをビジー状態に保ちたいと思います。

一時的なCPUの過剰使用があればOKです。使用量が少なく、処理されないタスクよりも優れています。

このスレッドロードバランスはどのように達成できますか?ありがとう。

+0

私は動的にパフォーマンスの問題を引き起こすことなくスレッドを生成する方法を見つけようとしています。静的な解決策のために、私は単に番号を設定することができます。関連:http://stackoverflow.com/questions/1718465/optimal-number-of-threads-per-core –

答えて

1

私はそれがあなたが何をしているかに依存すると思います。すでに一部のスレッドがI/Oを待っていることを暗示しています。

corePoolSizeは、アイドル状態であってもプールが保持するスレッドの数です。私はあなたが代わりに最大プールサイズを設定したいと思う。

コンテキスト切り替えのオーバーヘッドは常にそこにあります。切り替えは通常、一定のスライスとして実装されているため、実際にはスレッド数が増えるとは思われません(つまり、タイムスライスは実行可能スレッドの数に反比例して減少しません)。

完全ロードを達成するためのコア数と同じくらい多くのスレッドが必要であることは明らかです。スレッドが完了する速さとI/Oの所要時間に依存します。

大規模なプール・サイズを持つ別のステップでI/Oを実行する方法があります。そのため、I/Oステップが完了していることが常に確認されます(CompletableFutureの方が便利です)。次に、次のステップでは、別のThreadPoolを使用します。これは、1つのスレッドが完了するとすぐに前のステップから供給されるコアの数と同じプールサイズを持ちます。 (未確認)。このような

何か:

CompletableFuture.supplyAsync(ioTask, ioExecutorWithLargePool) 
    .thenAccept(cpuBoundTask, executorWithCpuCoreSizedPool); 
1

あなたはコアの数を定義するためにAmdahl's lawに見ることができます。あたかもシングルスレッドのプログラムであるかのようにプログラムを実行し、並列化できる場所を見てください。これはあなたにNのアイデアを与えることができます(ここでは、コアの数をアプリケーションのスレッド数で近似できます)。

私の経験では、「最高」のスレッド数を設定する最良の方法は、マルチスレッドプログラムを作成し、スレッド番号の可能な限り多くの値でテストし、どれが最高のパフォーマンスを出すかを確認することです。 john16384の答えに加えたよう

1

を(もOptimal number of threads per core参照):あなたのCPUは、CPUコア(マルチスレッド)ごとに2つのスレッドをサポートしている場合

あなたのコードRuntime.getRuntime().availableProcessors()? Runtime.getRuntime().availableProcessors() * 2は良い考えかもしれません。

3

サイジングスレッドプールは、そのプールで実行するタスクの性質によって異なります。一般的なルールとして、待機時間とCPU時間の比率と利用可能なCPUの数によって異なります。

適用する一般式は次のとおりです。目的の利用にプロセッサを維持するための

Sizing Threads Pools

最適なプール・サイズは次のとおりです。

Optimal thread-pool sizing

あなたがでより多くの情報を見つけることができますJava Concurrency In Practice、セクション8.2スレッドプールのサイジング

関連する問題