34

Thomas Marquardtによる次の記事では、IISがASP.Net要求を処理する方法、実行するように構成できる最大/最小CLRワーカースレッド/管理対象IOスレッド、関連するさまざまな要求キュー、およびそれらの既定のサイズについて説明します。

記事によると、IIS6.0では次のことが発生します。

  1. ASP.NETは、IIS IOスレッドから要求を取得し、「HSE_STATUS_PENDING」をIISIOスレッドに投稿します。
  2. リクエストはCLRワーカースレッドに渡されます
  3. リクエストのレイテンシが高く、すべてのスレッドが占有されている場合(スレッド数がhttpRuntime.minFreeThreadsに近づく場合)、リクエストはアプリケーションレベルのリクエストキューに送信されます(このキューはAppDomainごとにあります)
  4. また、ASP.NETは、同時に実行されている要求の数をチェックします。この記事では、「同時に実行される要求の数が多すぎる場合」、着信要求をASP.NETグローバル要求キューにキューに入れると述べています(これはワーカープロセスごとです)(更新2を確認してください)

ASP.NETが現在実行している要求の数が多すぎると見なし、グローバルASP.NET要求キューへの要求のキューイングを開始する「しきい値」とは何かを知りたいですか?

このしきい値は、ワーカースレッドの最大数の構成に依存すると思いますが、ASP.NETが同時に実行される要求の数が多すぎると判断し、ASP.NETへの要求のキューイングを開始する式がある可能性があります。グローバル要求キュー。この式は何でしょうか?または、この設定は構成可能ですか?


更新
私は記事をもう一度読み、コメントセクションでこれを見つけました:

1)IIS6およびIIS7クラシックモードでは、各アプリケーション(AppDomain)には、ワーカースレッドの可用性を維持するために使用するキューがあります。使用可能なワーカースレッドの数がhttpRuntimeminFreeThreadsで指定された制限を下回ると、このキュー内の要求の数が増加します。httpRuntime appRequestQueueLimitで指定された制限を超えると、要求は503ステータスコードで拒否され、クライアントは「サーバーがビジーです」というメッセージとともにHttpExceptionを受け取ります。ASP.NETパフォーマンスカウンター「アプリケーションキュー内の要求」もあり、キュー内の要求の数を示します。はい、CLRスレッドプールは.NETThreadPoolクラスによって公開されているものです。

2)requestQueueLimitの名前が適切ではありません。実際には、ASP.NETが同時に処理できる要求の最大数を制限します。これには、キューに入れられているリクエストと実行中のリクエストの両方が含まれます。「RequestsCurrent」パフォーマンスカウンターがrequestQueueLimitを超えると、新しい着信リクエストは503ステータスコードで拒否されます。

したがって、基本的にrequestQueueLimitは、キューに入れられて実行されている要求の数を制限します(Applicationキューにキューに入れられた要求の数とグローバルASP.Net要求キューに現在実行中の要求の数を合計すると想定しています)。これは元の質問に答えるものではありませんが、同時要求/高遅延要求の数が多いために503サーバービジーエラーが発生する可能性がある場合の情報を提供します。 (アップデート2を確認してください)


アップデート2 理解に誤りがありました。IIS6とIIS7の説明を混同していました。
基本的に、ASP.NETがIIS 7.5および7.0で統合モードでホストされている場合、アプリケーションレベルのキューは存在しなくなり、ASP.NETはグローバル要求キューを維持します。
したがって、IIS 7 / 7.5は、実行中の要求の数が多いと見なされた場合に、要求をグローバル要求キューにキューイングし始めます。この質問は、6ではなくIIS 7 / 7.5に当てはまり ます。IIS6.0

に関する 限り、グローバルASP.NET要求キューはありませんが、次のことが当てはまり ます。1.ASP.NETはIISIOスレッドから要求を取得します。そして、「HSE_STATUS_PENDING」をIISIOスレッド 2に投稿します。要求はCLRワーカースレッドに渡されます。


3.要求の待ち時間が長く、すべてのスレッドが占有されている場合(スレッド数がhttpRuntime.minFreeThreadsに近づく場合)、要求はアプリケーションレベルの要求キューに送信されます(このキューはAppDomainごとにあります)。4。ASP.NET
もチェックします。新しいリクエストを受け入れる前にキューに入れられ、現在実行されているリクエストの数。この数がprocessModel.requestQueueLimitで指定された値より大きい場合、着信リクエストは503サーバービジーエラーで拒否されます。

4

1 に答える 1

4

この記事は、設定をもう少しよく理解するのに役立つかもしれません。

minFreeThreads:この設定は、スレッドプールで使用可能なスレッドの数がこの設定の値を下回った場合に、すべての着信要求をキューに入れるためにワーカープロセスによって使用されます。この設定は、同時に実行できるリクエストの数をmaxWorkerThreadsminFreeThreadsに効果的に制限します。minFreeThreadsを88*CPUの数に設定します。これにより、同時リクエストの数が12に制限されます(maxWorkerThreadsが100であると想定)。

編集:

このSOの投稿では、Thomasが統合パイプラインでのリクエスト処理の詳細と例を提供しています。追加の説明については、回答のコメントを必ずお読みください。

ネイティブコールバック(webengine.dll内)がCLRワーカースレッドでリクエストを取得し、 maxConcurrentRequestsPerCPU*CPUCountをアクティブなリクエストの総数と比較します。制限を超えた場合、リクエストはグローバルキュー(ネイティブコード)に挿入されます。それ以外の場合は実行されます。キューに入れられていた場合は、アクティブなリクエストの1つが完了するとデキューされます。

于 2012-06-15T00:40:19.550 に答える