2011-12-03 4 views
1

20個の製品を返すGetProductsメソッドがあります。各製品は作成にかなりの時間がかかります(多くの場所から多くのリソースがあります)。.NETで時間のかかるオブジェクトを作成するための操作が1つ多いスレッド

スレッドプールキューを使用して20種類のスレッドをスピンアップして、各製品の作成を処理することをお勧めしますか?

これは、負荷の大きいサーバを壊しますか?私のアプリケーションは負荷が高いという危険性があります。

実際にこのようなことが実装されているため、負荷テストを行っている間にサーバが正常に動作しなくなり、正常に動作するように完全に再起動する必要があります。

紛失している方法がありますか?私はそれを完全に間違っているのですか?私は同期処理に固執すべきですか?

:私の負荷テストを行う場合は、サーバのメモリがはるかに道を使用していた、そして時には、エラーが(メモリ不足サーバー)を投げました。ガベージコレクタは十分速く動作していませんか?

また、私の製品はコマースサーバーから読み込まれていますが、製品に添付する必要があるリソース(イメージ、ドキュメント、レビューなど)がたくさんあります。

また、私のアーキテクチャは、Webフロントエンドが完全にwcfサービス(スレッドを実行する)に座っている2段階の設定です。 wcf層は不自由なものです。サーバは8コアサーバ上で仮想的で、gbのRAMが割り当てられています。

パーソナルノート私はマルチセディングを悪用していると感じています。 "GetProducts"の呼び出しは非同期でなければなりませんが、 "GetProducts"は20の非同期操作を行う必要はありません。

+0

詳細情報が必要です。製品がDBからロードされているか(適切なインデックス、ビューを使用する場合)、Webサービス、ファイル、など... –

+2

あなたはCPUにバインドされていますか?またはディスクバインド?またはネットワーク接続? –

+0

いくつかの質問:1)いくつの製品を合計して扱っていますか?2)20の代わりに1つの製品を作成する場合は、どれくらいかかりますか? 3)製品はどのくらいの頻度で変更されますか? – Todd

答えて

2

CPUにバインドされていても、20個のコアがある場合を除き、20スレッドをスピンアップするのはおそらく過剰です。およびはこれに専用です。既に高度にスレッド化されているasp.netではありません。

スレッディングを追加すると、同期が難しくなります。現在の実装でデッドロックが発生しているのは本当に不思議です。

異なる場所からデータが送信される場合、非同期は意味がありますが、過度に過ぎる可能性があります。いくつかの点で、プールスレッドを使用すると、システム全体からの処理を完全に奪うことはできません(プールにはいくつかの組み込みがあり、通常は20個のスレッドに<スレッドを使用します)。

1

これらの製品をメモリにキャッシュする方法を検討する価値はあるかもしれません。作成に時間がかかりますが、頻繁に変更しない場合は、サーバーの起動時や必要に応じて作成するか、別のプロセスで作成して、Webサーバーが読み取るキャッシュにデータを入れることができます。

Marcが述べたように、このPER CONCURRENT CLIENTに専念する20のコアを持っていなければ、実際にこれを行うことではほとんど得られません。私はあなたが慎重ではない場合デッドロックにつながる可能性があるので、可能な限り私のWebサーバーでマルチスレッドのコードを避けようとします。

+0

良い点。アンダーロード、GetProducts()は1分以内に20回呼び出すことができます。彼らは200のコアサーバを作っていますか?笑。 –

関連する問題