文書番号: 821268 - 最終更新日: 2007年3月20日 - リビジョン: 7.2 ASP.NET アプリケーションから Web サービス要求を行うと、競合、パフォーマンスの低下、およびデッドロックが発生する目次現象
ASP.NET アプリケーションから XML Web サービスに対する呼び出しを行うと、競合、パフォーマンスの低下、およびデッドロックが発生する場合があります。要求が応答を停止 (ハング) したことがクライアントから通知されることや、実行に時間がかかることがあります。デッドロックの可能性がある場合は、ワーカー プロセスが再利用されている可能性があります。アプリケーション イベント ログに、以下のメッセージが出力されることがあります。
"System.InvalidOperationException: 操作を完了するために十分なフリー スレッドが ThreadPool オブジェクトにありませんでした。"
"HttpException (0x80004005): 要求がタイムアウトしました"
原因
この問題は、ASP.NET で、呼び出しが要求の実行に使用するワーカー スレッドと完了ポート スレッドの数が制限されているために発生することがあります。
通常、Web サービスに対する呼び出しでは、要求を送信するコードの実行に 1 つのワーカー スレッドを使用し、Web サービスからのコールバックの受信に 1 つの完了ポート スレッドを使用します。ただし、要求がリダイレクトされた場合や、認証が必要な場合は、呼び出しで 2 つのワーカー スレッドと 2 つの完了ポート スレッドが使用されることがあります。そのため、複数の Web サービス呼び出しが同時に発生すると、管理されている ThreadPool が枯渇する可能性があります。 たとえば、ThreadPool のワーカー スレッド数が 10 に制限されていて、10 個のすべてのワーカー スレッドで、コールバックの実行を待機するコードを実行中であるとします。この場合、ThreadPool のキューに格納されている作業項目はすべて、スレッドが使用可能になるまでブロックされるため、コールバックは実行できません。 競合の原因としてもう 1 つ考えられるのは、接続数を制限するために System.Net 名前空間が使用する maxconnection パラメータです。通常は、この制限は正常に機能します。しかし、多くのアプリケーションが単一の IP アドレスに対して多数の要求を同時に実行すると、接続が使用可能になるまでスレッドが待機することが必要な場合もあります。 解決方法
これらの問題を解決するには、状況に応じて Machine.config ファイル内の以下のパラメータを調整します。
maxWorkerThreads および maxIoThreadsASP.NET では、次の構成設定を使用して、使用するワーカー スレッドと完了スレッドの最大数を制限します。
2*maxWorkerThreads minFreeThreads および minLocalRequestFreeThreadsまた、ASP.NET では、次の構成設定で、リモート要求またはローカル要求を開始するために必要なワーカー スレッドと完了ポート スレッドの数が決まります。
(maxWorkerThreads*number of CPUs)-minFreeThreads 注 : minFreeThreads パラメータと minLocalRequestFreeThreads パラメータには、暗黙的に CPU の数が掛けられることはありません。
minWorkerThreadsASP.NET 1.0 Service Pack 3 および ASP.NET 1.1 では、次の構成設定で、リモート要求の処理にすぐに使用できるワーカー スレッドの数が決まります。maxconnectionmaxconnection パラメータには、特定の IP アドレスに対して確立できる接続の数を指定します。このパラメータの例を以下に示します。executionTimeoutASP.NET では、次の構成設定を使用して、要求の実行時間を制限します。注 : executionTimeout パラメータの値を大きくすると、processModel responseDeadlockInterval パラメータの設定の修正も必要となる場合があります。 推奨事項ここに示す推奨設定は、すべてのアプリケーションで有効であるとは限りません。ただし、以下の追加情報を参照して、適切な設定に調整できる場合もあります。各 ASPX ページから単一の IP アドレスに対して 1 つの Web サービス呼び出しを実行する場合は、次の構成設定を使用することをお勧めします。
注 : この構成を使用すると、100-88=12 であるため、1 CPU あたり最大 12 個の ASP.NET 要求を同時に実行できます。したがって、少なくとも 88*N 個のワーカー スレッドと 88*N 個の完了ポート スレッドを別の用途 (Web サービスのコールバックなど) に使用できます。 たとえば、プロセッサが 4 台でハイパー スレッディングが有効になっているサーバーがあるとします。上記の計算式に基づき、この資料に記載されている構成設定には、以下の値を使用します。 また、この構成を使用すると、各 AppDomain で 1 つの IP アドレスに対して 1 CPU あたり 12 個の接続を使用できます。したがって、以下の場合、要求が接続を待機している間に競合が発生することはほとんどなく、ThreadPool が枯渇することはありません。
状況
この動作は仕様です。
関連情報
詳細については、次の MSDN (Microsoft Developer Network) Web サイトを参照してください。
http://www.microsoft.com/japan/msdn/enterprise/pag/scalenetchapt06.aspx
(http://www.microsoft.com/japan/msdn/enterprise/pag/scalenetchapt06.aspx)
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。" | サポート技術情報の翻訳
|
先頭へ戻る
