2

非常に大規模なアプリケーションでメモリの急増を修正しようとしています。これがメモリにどの程度の影響を与えるかはわかりませんが、次のことに気づきました。

  • アプリケーションはカスタムスレッドプールを使用して、すべての高価なタスクを実行します
  • アプリケーションはすべての着信タスクを実行します
  • タスクは、何千ものサブタスクで構成できます
  • スレッドプールは一度に{T}タスクのみを実行し、新しいタスクを開始する前にタスクを完全に終了しますが、新しいシステムスレッド(スレッドクラス)を作成し、それに追加されたすべてのサブタスクに対して開始します
  • サブタスクシステムスレッドは、スレッドプールスロットが解放されるまで手動リセットイベント(MRE)を即座にブロックするスレッド開始で開始されます。

したがって、このスレッドプールは数千のスレッドを作成できますが、他のタスクが完了する間、30を除くすべて(または構成したもの)がMREでブロックされます。

私の質問:


MREでブロックされた1000のスレッドは、メモリ/プロセッサにどのような影響を与えますか?このスパイクを修正する時間はあまりないので、それが最小限である場合は、問題を残して、時間があれば後のパッチで修正するように努めます。

また、この動作はスレッドプールで一般的ですか、それともこのサウンドに欠陥がありますか(私は欠陥に傾いていますが、確かに十分な背景がありません)。

4

1 に答える 1

3

MREでブロックされた1000のスレッドは、メモリ/プロセッサにどのような影響を与えますか?このスパイクを修正する時間はあまりないので、それが最小限である場合は、問題を残して、時間があれば後のパッチで修正するように努めます。

各スレッドは、手動で作成されると、独自のスタックが割り当てられます。デフォルトでは、これはスレッドあたり1MBになりますが、コンストラクターパラメーターを使用してより小さなスタックでスレッドを作成することもできます。

問題の説明から、標準のThreadPoolと、BlockingCollection<T>スロットルを処理するようなクラスを使用するように、これを再設計する方がはるかに良いでしょう。これは、ブロッキングを使用して、境界入力を直接許可するように設計されています。無限の数のスレッドのカスタム「スレッドプール」を作成することは、フレームワークに含まれている高度に調整されたThreadPoolを使用するよりもはるかに効率が悪くなります。

また、この動作はスレッドプールで一般的ですか、それともこのサウンドに欠陥がありますか(私は欠陥に傾いていますが、確かに十分な背景がありません)。

これは間違いなく欠陥があります。ThreadPoolの全体的なポイントは、リクエストごとにスレッドを作成することを避け、スレッドを再作成せずに複数のリクエストに対してスレッドを「プール」(再利用)することです。

于 2013-03-07T17:38:49.183 に答える