1

Asp.net2にはデフォルトで12のスレッドがあります

現在、Asp.Net 4には5000があります。まだ非同期コントローラーが必要ですか?

4

3 に答える 3

6

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

はい。非同期コントローラーは、ネットワークコールなどの長時間の操作があり、それらのワーカースレッドを独占したくない場合に役立ちます。デフォルトで5000のワーカースレッドがあるという事実は、それらを無駄にする必要があるという意味ではありません。あなたがあなたのお金を配っているのはあなたが百万長者だからですか?いいえ。

明らかに、非同期コントローラーを正しく使用しないと、害を及ぼす可能性があります。

于 2011-01-31T11:58:25.390 に答える
2

MVC 4 / Dev11は、非同期コントローラーを以前のバージョンよりも魅力的にします。そのWebAPIに追加して、Webサービスを簡単に作成できるようにします。見逃さないようにリーバイスのコメントを開始(@Darin Dimitrovの優れた回答の下)

ダリンの答えを少し拡張します-非同期I/O操作(AsyncControllerが対象としているもの)は、ThreadPoolスレッドではなくIOCPを使用して動作します。各ThreadPoolスレッドには1MBのスタック(およびその他のオーバーヘッド)が関連付けられているため、これは重要です。したがって、5000のThreadPoolスレッドを使用している場合、オーバーヘッドのために5GBのメモリが自動的に失われます。IOCPの継続には、それほど多くのオーバーヘッドがないため、いつでもより多くの継続を調整することができます。ThreadPoolスレッドはプールされ、不要になったときに削除されます。そのため、現在アクティブなスレッドに対してのみヒットします。ただし、ThreadPoolを使用してCPUにバインドされた作業を同時に実行している場合は、メモリの問題が急速に発生し始めます。

AsyncforWebサービスはしばしば理にかなっています-データベース呼び出しが非同期パートIIである必要があるかどうかを参照してください

非同期操作を使用してWebサーバー上のブロックされたスレッドの数を減らすデータベースアプリケーションの場合、ほとんどの場合、完全に時間の無駄になります。小さなWebサーバーは、データベースのバックエンドが同時に処理できるよりもはるかに多くの同時ブロッキング要求を簡単に処理できます。代わりに、データベースでのサービスコールが安価であることを確認し、同時に実行されるリクエストの数を、正しく機能して全体的なトランザクションスループットを最大化するためにテストした数に制限します。

データベース呼び出しを非同期にする必要がありますか?を参照してください。

于 2012-04-10T20:28:13.147 に答える
0

4または5000、それは問題ではありません、それはただの設定です。必要に応じて10億に設定できますが、それによってアプリケーションがさらにスカラベになることはありません。最終的に、マシンには4つのコアしかありません(または8または2ですが、5000はありません)。同時に実行できるスレッドの数は、コアの数と同じであることに常に注意してください。コアの数を超えているすべてのスレッドは、単なるオーバーヘッドです。より多くのコンテキストスイッチを作成し、CPUを消費し、より多くのメモリを占有します。

IO(データベースアクセス、Webサービス、ファイルアクセス...)はCPUを使用していません。同期的に実行すると、操作の長さの間スレッドがブロックされます。長時間の操作(5秒)があり、1秒あたり1,000リクエストの負荷がある場合、5,000スレッドを永続的にブロックします。したがって、あなたはすでにスレッドプールを飢えさせています(5,000の設定で)。しかし、さらに悪いことに、コンテキストスイッチを使用してマシンをゴミ箱に移動することになります。非同期で実行すると、スレッドがブロックされたり、リソースが使用されたりすることはなく、実行できる同時IOの数に制限はありません。

非同期IOを使用してアプリケーションを書き直す余裕がない場合、スレッドプールにスレッドを追加することは、迅速で汚いハックです。クリーンなソリューションではありません。

于 2012-04-10T13:54:35.183 に答える