質問

JavaでFixedThreadPool Executorオブジェクトを作成する場合、Executorが同時に実行できるスレッドの数を示す引数を渡す必要があります。私は、電話番号の大規模なコレクションを処理することを担当するサービスクラスを構築しています。電話番号ごとに、Webサービスを実行し(これが私のボトルネックです)、応答をハッシュマップに保存する必要があります。

このボトルネックをサービスのパフォーマンスへの害を少なくするために、未処理の要素を取得して処理するWorkerクラスを作成することにしました。ワーカークラスはRunnableインターフェイスを実装し、Executorを使用してワーカーを実行します。

同時に実行できるワーカーの数は、Executor FixedThreadPoolのサイズによって異なります。 ThreadPoolの安全なサイズはどれくらいですか?引数としていくつかの大きな数値を使用してFixedTheradPoolを作成するとどうなりますか?

役に立ちましたか?

解決

各ワーカースレッドがWebサービス呼び出しを行う必要がある場合、プール内のスレッドの数は、Webサービスが処理できる同時リクエストの数に大きく影響される必要があります。それ以上のスレッドは、Webサービスを圧倒するだけです。

他のヒント

考えられるものは見ているもの

Runtime.getRuntime().availableProcessors()

これは、システムにとって意味のあるスレッドの数について何らかの指示を与えます。

スレッドの最適な数はコア数* 25であると読んでいます。.NETはこれをThreadPoolのデフォルトとして使用しているようです。ただし、多数のWebサービス呼び出しがある場合は、単一のスレッドを使用して、Webサービス呼び出しのリストで応答を確認することをお勧めします。応答が到着したら、エントリを処理してリストから削除するだけです。

各計算がWebサービスの呼び出しに相当する場合、そのサービスにかかる負荷の量/そのサービスがサービスの所有者によって許容または許可される同時接続の数を考慮する必要があります。ほとんどの公的にアクセス可能なサービスは、一度に1人のユーザーからそのような接続を1つだけ期待します。可能であれば、使用ポリシーについてサービスの所有者に問い合わせてください。このような接続の数によって、使用できるスレッドの数が決まります。

開発者がWebサービスにアクセスできる場合、1回の呼び出しで複数の電話番号を確認するバッチ機能を作成することを検討してください。

新しい.NETには、独自のパフォーマンスプロファイルに基づいて拡大および縮小できるThreadPoolがあります。残念ながら、Javaのバージョンは修正されているか、受信する作業に基づいて制限まで大きくなります。

かつて同様の懸念がありました。私たちのソリューションは、顧客がプールサイズを調整し、パフォーマンスを調整できるようにすることでした。

I / O操作プールのサイズ設定で考慮されるネットワークおよびデータのプロパティには、ネットワーク帯域幅、メッセージサイズ、Webサービスの処理時間とスタイル、ローカルコアの数などがあります。

Webサービスは無限にスケーラブルであり、リクエストでスパムしていることを誰も気にしないと仮定しましょう。また、Webサービスの応答が1秒の範囲内にあり、ローカル処理時間が5ミリ秒であると仮定します。

処理コアと同じ量のビジースレッドがある場合、スループットは最大化されます。

これらの仮定の下では、適切なサイズのスレッドプールに対してマルチコアプロセッサのスループットを最大化することはできません。 1秒あたりの最大トランザクション数を達成するには、接続モデルごとにスレッドを分割する必要があります。前述のノンブロッキングI / O(NIO)、または非同期完了トークンパターン(WindowsのIO完了)のJava実装を探します。

作成されたすべてのスレッド用に予約されているスタックメモリは、実際に割り当てられたメモリまたはコミットされたメモリではなく、実際にはアドレススペースだけです。スタックが成長しようとすると、例外がスローされ、その結果、スタックメモリがオンデマンドでコミットされます。その結果、32ビットメモリマネージャーにのみ実際に関連することになります。 64ビットメモリの場合、物理メモリでそのスペースのごく一部だけをバックアップしている場合でも、巨大なアドレススペースがあります。少なくとも、これがWindowsの動作を理解する方法であり、Unixの世界についてはわかりません。

作成する各スレッドは、スタックサイズのメモリを要求することも忘れないでください。そのため、スレッドのプールを作成すると、プロセスのメモリフットプリントに影響します(実際に必要になるまでスレッドを作成しないプールがあるため、起動時にメモリが増加することはありません)。

このスタックサイズは、 -Xss で設定可能です( -Xmx などと同様)。デフォルトはスレッドあたり512Kbです。現時点では、それを確認する権威がありません。

スレッドよりもNIOを使用したほうが良いのではないかと思います。制限要因は、クライアントCPUではなくWebサービスサーバー+ネットワークのボトルネックになるからです。

それ以外の場合は、Webサービスがサポートできる同時接続の数を超えないようにしてください。

並列配列操作などの重い計算を行う場合、経験則では、プロセッサの数に対してスレッドの数を使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top