35

違いは何ですか-

newSingleThreadExecutor vs newFixedThreadPool(20)

オペレーティングシステムとプログラミングの観点から。

プログラムを使用してプログラムを実行しているときはいつでも、newSingleThreadExecutor非常にうまく機能し、エンド ツー エンドのレイテンシ (95 パーセンタイル) が発生し5msます。

しかし、使用してプログラムを実行し始めるとすぐに-

newFixedThreadPool(20)

プログラムのパフォーマンスが低下し、エンド ツー エンドのレイテンシが37ms.

だから今、私はアーキテクチャの観点から、ここでスレッド数が何を意味するのかを理解しようとしていますか? また、選択すべき最適なスレッド数をどのように決定すればよいでしょうか?

さらに多くのスレッドを使用している場合、どうなりますか?

誰かが私にこれらの簡単なことを素人の言葉で説明できれば、それは私にとって非常に役に立ちます. 助けてくれてありがとう。

私のマシン構成仕様 - Linux マシンからプログラムを実行しています -

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 45
model name      : Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
stepping        : 7
cpu MHz         : 2599.999
cache size      : 20480 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm arat pln pts
bogomips        : 5199.99
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 45
model name      : Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
stepping        : 7
cpu MHz         : 2599.999
cache size      : 20480 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm arat pln pts
bogomips        : 5199.99
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:
4

3 に答える 3

54

Ok。理想的には、スレッドが互いに (互いに独立して) ブロックしないようなロックを持たず、作業負荷 (処理) が同じであると仮定すると、プールRuntime.getRuntime().availableProcessors()サイズavailableProcessors() + 1が最高の結果。

しかし、たとえば、スレッドが互いに干渉したり、I/O が関与したりする場合、アマダルの法則はかなりうまく説明できます。ウィキより、

アムダールの法則は、P が並列化できる (つまり、並列化の恩恵を受ける) プログラムの割合であり、(1 − P) が並列化できない (直列のままである) 割合である場合、可能な最大速度向上は次のように述べています。 N 個のプロセッサを使用して達成されるのは、

アマダール法

あなたの場合、利用可能なコアの数と、それらが正確に行う作業 (純粋な計算? I/O? ロックの保持? 一部のリソースのブロック? など) に基づいて、上記に基づいたソリューションを考え出す必要があります。パラメーター。

例: 数か月前、数値 Web サイトからのデータ収集に携わっていました。私のマシンは 4 コアで、プール サイズは4. しかし、操作は純粋I/Oであり、ネット速度もまあまあだったので、プール サイズ7. これは、スレッドが計算能力ではなく、I/O のために戦っていたためです。したがって、より多くのスレッドがコアを積極的に争うことができるという事実を活用できます。

PS: Brian Goetz 著の本 - Java Concurrency in Practice の Performance の章を参照することをお勧めします。といったことを細かく扱っています。

于 2013-04-21T06:14:10.560 に答える
7

だから今、私はアーキテクチャの観点から、ここでスレッド数が何を意味するのかを理解しようとしていますか?

各スレッドには、独自のスタック メモリ、プログラム カウンター (次に実行される命令へのポインターなど)、およびその他のローカル リソースがあります。それらを交換すると、単一のタスクの待ち時間が長くなります。利点は、1 つのスレッドがアイドル状態の間 (通常は i/o を待っているとき)、別のスレッドが作業を完了できることです。また、使用可能なプロセッサが複数ある場合、タスク間にリソースやロックの競合がない場合は、それらを並行して実行できます。

また、選択すべき最適なスレッド数をどのように決定すればよいでしょうか?

スワップ価格とアイドル時間を回避する機会の間のトレードオフは、タスクがどのように見えるかの詳細 (I/O の量、I/O 間の作業量、I/O 間の作業量、メモリの使用量) に依存します。完了)。実験は常に鍵となります。

さらに多くのスレッドを使用している場合、どうなりますか?

通常、最初はスループットが直線的に増加し、次に比較的平坦な部分があり、その後低下します (かなり急激な場合があります)。各システムは異なります。

于 2013-04-21T06:17:06.030 に答える
5

Looking at Amdahl’s law is fine, especially if you know exactly how big P and N are. Since this will never really happen, you could monitor the performance (which you should do anyway) and increase/decrease you thread pool size to optimize whatever performance metrics are important to you.

于 2013-04-21T21:48:09.193 に答える