2011-01-31 20 views

答えて

6

まだ非同期コントローラが必要ですか?

はい。非同期コントローラは、ネットワークコールなどの操作が長く、ワーカースレッドを独占したくない場合に便利です。既定で5000のワーカースレッドがあるということは、それらを浪費しなければならないという意味ではありません。それはあなたがあなたのお金を払っている億万長者なのですか? No.

明らかに非同期コントローラを使用しないと、正常よりも害が大きくなります。

+0

を参照してくださいしかし、非同期があまりにもオーバーヘッドが

あなたのサービスの呼び出しがデータベースで安価であることを確認してください、とあなたが正しく機能するためにテストされている番号に同時実行要求の数を制限し、全体的なトランザクション・スループットを最大化。新しいスレッドを作成しますか?私は、5000リクエストはどんなサーバーでも処理できることが多いと思うので、非同期でより多くのスレッドを作成し、より複雑なコードを使用するのはなぜですか? –

+0

AsyncControllerは新しいスレッドを作成しません。スレッドプールからスレッドを再利用します。 –

+0

もしそれがスレッドプールスレッドを無駄にするなら、どのような利点がありますか? –

0

4または5000、それは問題ではなく、単なる設定です。あなたが望むなら、10億に設定することができます。それはあなたのアプリケーションをもっとスケーラビにしません。最後に、マシンには4つのコア(または8または2ではなく、5000)があります。コアの数だけ同時に多くのスレッドを実行できることを常に心に留めておいてください。あなたのコア数を超過したスレッドはオーバーヘッドに過ぎません。より多くのコンテキストスイッチを作成し、CPUを消費し、より多くのメモリを占有します。

IO(データベースアクセス、Webサービス、ファイルアクセス...)はCPUを占有していません。同期的に行うと、操作の長さに応じてスレッドがブロックされます。長時間の操作(5秒間)、1秒あたり1,000リクエストの負荷がある場合は、5,000スレッドを永久にブロックします。あなたは既にスレッドプールを飢えています(5,000の設定で)。しかし、より悪いのは、あなたがコンテキストスイッチを使って機械を捨てることです。非同期に行うと、スレッドはブロックされず、リソースは使用されず、実行可能な並行IOの数に制限はありません。

スレッドプールにスレッドを追加すると、非同期IOを使用してアプリケーションを書き直す余裕がない場合に、素早く汚れたハックが発生します。これはクリーンな解決策ではありません。

+0

>>長時間の操作(5秒間)、1秒間に1,000リクエストの負荷がある場合は、asynchが魔法のようにサイトを実行可能にすることはありません。データアクセスを修正する必要があります。 [1]を参照してください:http://blogs.msdn.com/b/rickandy/archive/2011/07/19/should-my-database-calls-be-asynchronous-part-ii.aspx [2]:http ://blogs.msdn.com/b/rickandy/archive/2009/11/14/should-my-database-calls-be-asynchronous.aspx – RickAndMSFT

2

MVC 4/Dev11は、非同期コントローラを以前のバージョンよりも魅力的にします。そのWebAPIに追加すると、Webサービスを簡単に作成できます。スタートリーバイスコメントの 彼らはダーリンの答えに少し拡大

(@Darinディミトロフの優れた答えの下)見逃すことはありませんので - 非同期I/O操作( がAsyncControllerが意図されているものである)を使用して動作IOCPではなく、 スレッドプールスレッド。これは重要です。各ThreadPoolスレッドには、関連付けられた1 MBスタック(およびその他のオーバーヘッド)が であるため、 5000 ThreadPoolスレッドを使用している場合、オーバーヘッドのために自動的に5GBのメモリが失われます。 IOCPの継続性には、オーバーヘッドが にはならないので、任意の時間に に多くの番号を入れ替えることができます。 が不要になったときにThreadPoolスレッドがプールされ、削除されます。現在は がアクティブなスレッドに対してのみヒットします。しかし、 ThreadPoolを使用してCPUを同時に処理することが多い場合は、非常に迅速にメモリ問題に遭遇します。 これは、C#/ VBチームが数ヶ月前に Async CTPをリリースした理由の1つです。この問題を解決しようとしています。

Webサービスの非同期は、多くの場合、理にかなって - ウェブサーバ上でブロックされたスレッドの数を減らすために非同期操作を使用してデータベース・アプリケーションのためにShould my database calls be Asynchronous Part II

を参照してくださいすることはほとんど常に完全な時間の無駄です。小規模なWebサーバーは、データベースのバックエンドが同時に処理できるよりも多くのブロッキング要求を容易に処理できます。代わりにShould my database calls be Asynchronous?

関連する問題