2010-12-13 18 views
5

WS 2008 R2上でIIS(統合モード)で実行されているWCFサービスを通じて開始される長時間実行されるビジネスプロセスがあります。これらのビジネスプロセスには、通常、SQL Serverのバックエンドとのやりとりが多く含まれています。リクエストが初期サービスコールによってキューに入れられ、後で優先順位に基づいて実行されるカスタムタスクキューインプリメンテーションが作成されました。この実行には完了までに時間がかかることがあります(極端に20〜30分)。クライアントは、自分のバックグラウンドタスクの進行状況をサーバーに問い合わせることができます。ThreadPoolsと長時間実行のプロセス用のスレッド

現在の実装では、タスクはThreadPoolからではなく、実行する別のスレッドで起動します。これは、reading recommendationsのThreadPoolを使用して長時間実行されていないタスクが実行されていないために、ASP.NET要求の枯渇を防ぐために行われました。同時に実行できるバックグラウンドタスクの数に上限を設定することによって、生成されるスレッドの数を制御します。このようにして、CPUの負荷を制御し、スレッドのコンテキスト切り替えが多すぎるのを防ぎます。これがすべて起こっている間も、もちろん、アプリケーションの通常の「オンライン」要求にも対応する必要があります。

Thomas Marquardtがthis postを読んだ後は、私たちがThreadPoolを使用していないという事実に心配しています。私たちはそれに組み込まれたチューニングヒューリスティックの利点を得られないからです。 Thomasは、ApplicationEndイベントにフックして長時間実行されるタスクをキャンセルすることで、Thomasが言及したシャットダウンの問題を解決しました。だから私の質問は、我々はThreadPoolを使用するに切り替える必要がありますか?長い時間の間、これらのスレッドは結ばれていますか?私がThomasを正しく理解していれば、ThreadPoolが通常のオンライン操作に対応するための要求を増やすように調整するので、これは問題ではないと言っていますか?私はまた同じ土地をカバーするthis StackOverflow questionを通して読んだが、私はまだ道を進んでいるかについてまだ不明である。

+0

詳細を教えてください。どのようなチューニングが欠けていると思われますか? –

+0

"tune"は正しい単語ではないかもしれませんが、バックグラウンドタスクがThreadPoolスレッドを使用して実行されている場合、ThreadPoolはシステムに追加される "load"の "awar"バックグラウンドタスクによって。通常のスレッドを使用してそれらを実行すると、ThreadPoolはこの知識を持ちません。繰り返しになりますが、私はThreadPoolヒューリスティックがどのように正確に動作するのかについて内部的な詳細は持っていませんが、Thomasのポストを読んで読んだことは、私たちがThreadPoolに組み込まれたこの「チューニング」ロジックを、 -ThreadPoolスレッド – Carel

答えて

1

これはあなたが尋ねたものではありませんが、長時間実行されているタスクを別々のプロセス(つまりWindowsサービス)で一緒に実行しないと、優先キューを構築することになります。時間後。バックグラウンドサービスがリクエストを処理している間、WCFサービスに直面しているフロントがリクエストをキューに入れ、ステータス更新クエリに応答するこの方法を採用しました。これにより、現在実行中のタスクを終了することを心配することなく、ワーカープロセスのリサイクルなどが可能になります。私が見ている問題は、アウトプロセス間通信のオーバーヘッドですが、それはタスクが取る時間と比較して重要ではないはずです(長時間実行しているので)。

1

私が提案したThreadPoolは、あなたが提供したリンクで提案されているスレッド飢餓の問題を抱えているため、避けてください。

当社の製品では、一連の引用符を使用するWebサービスへの呼び出しを呼び出すことができます。これは、最大40分の長時間実行されるプロセスである可能性があります。見積もりプロセスはCPUを大量に使用するため、クアッドコアサーバー上のスレッドプールを使用してCPU使用率を最大限に引き出します。

しかし、ASP.NETは要求を処理するためにスレッドプールを使用しているかのように見えるため、ユーザーが送信した新しいジョブは、最初のジョブが完了するまで決して開始されません。プール。これを回避するために、私は以前にThreadPoolThrottleと呼ばれていたWeb上で見つかったクラスを使用してきました。これは少し問題を全部解決しましたが、システムの使用が増えているので、私たちは同じ問題に遭遇しています。

私は現在asp.netアプリケーションのスレッド飢餓を防ぐために、プロセスの引用符を実行するVinayCの提案を検討しています。

関連する問題