RAM、CPU、ディスクなどを搭載した64ビットWindows Server 2008 R2 EnterpriseマシンでIIS 7.5の上で実行されているASP.NET 4.0アプリケーションがあります。
すべてのWeb要求で、ASP.NETアプリケーションは、同じマシン上で実行されているバックエンドWebサービスへの接続を(生のソケット経由で)行います。
問題:バックエンドWebサービスへの同時接続数を制限する何かがあるようです。疑わしいことに、同時接続の数は16を超えています。
多くのWebサービスリクエストを行うASP.NETアプリに対応するためにIISの設定を調整する方法を説明するMicrosoftのこの重要な記事を見つけました。 http://support.Microsoft.com/?id=821268#tocHeadRef =
私はこの記事の勧告に従いましたが、それでも運はありません。特に興味深い設定はmaxconnection
設定で、これは999にまで達しました。
どんなelseが接続をスロットルする可能性がありますか?
注:ミックスからIISを切り取り、クライアントをバックエンドWebサービスに直接接続すると、喜んで開きます必要な数の接続があるため、バックエンドがボトルネックではないことを確信しています。 IIS/ASP.NET-landにあるものでなければなりません。
ここに、machine.config
の関連セクションがあります。これは、アプリケーションによって読み取られていると確信しています(appcmd.exe
で検証済み):
<system.web>
<processModel autoConfig="false" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" />
<httpRuntime minFreeThreads="176" minLocalRequestFreeThreads="152"/>
<httpHandlers />
<membership>
<providers>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression="" />
</providers>
</membership>
<profile>
<providers>
<add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/"
type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</profile>
<roleManager>
<providers>
<add name="AspNetSqlRoleProvider" connectionStringName="LocalSqlServer" applicationName="/"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add name="AspNetWindowsTokenRoleProvider" applicationName="/"
type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
</system.web>
<system.net>
<connectionManagement>
<add address="*" maxconnection="999"/>
</connectionManagement>
</system.net>
ここで提供される回答のほとんどは、ASP.netアプリケーションからバックエンドサービスに作成できる送信リクエストの数ではなく、バックエンドWebサービスへの受信リクエストの数に対応しています。 。
ここでリクエストレートを調整しているのはバックエンドWebサービスではなく、呼び出し側アプリケーションが同じエンドポイント(同じURL)に対して確立しようとしているオープン接続の数です。
Machine.configファイルに次の構成セクションを追加することにより、この制限を削除できます。
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="65535"/>
</connectionManagement>
</system.net>
</configuration>
もちろん、50または100の同時接続が必要な場合は、より適切な数を選択できます。しかし、上記は最大までそれを開きます。すべてのアドレスを示す「*」ではなく、上記のオープン制限ルールに特定のアドレスを指定することもできます。
System.Net.connectionManagementのMSDNドキュメント
。NETのConnectManagementを理解するためのもう1つの優れたリソース
これで問題が解決することを願っています!
EDIT:おっと、上記のコードで述べた接続管理があるのはわかります。上記の情報は、同じ問題を抱える将来の問い合わせ者に関連しているため、残しておきます。ただし、最新のサーバーには現在4つのmachine.configファイルがあることに注意してください!
32ビットと64ビットの両方で実行される.NET Framework v2と、32ビットと64ビットの両方で実行される.NET Framework v4があります。選択したアプリケーションプールの設定に応じて、これら4つの異なるmachine.configファイルのいずれかを使用できます。通常ここにある4つのmachine.configファイルすべてを確認してください。
質問はかなり古いかもしれませんが、バックエンドが同じサーバーで実行されていると言います。これは、おそらくデフォルトのポート80以外の別のポートを意味します。
「connectionManagement」構成要素を使用するときに、デフォルトの80と異なる場合はポート番号を指定する必要があることを読みました。
リンク: ASP.NETでautoConfig = falseでもmaxConnection設定が機能しない場合があります
第二に、独自のバックエンド固有の値で拡張されたデフォルト設定(address = "*")を使用することを選択した場合、特定の値を最初に置くことを検討してください。それ以外の場合、要求が行われると、*が最初に一致し、デフォルトの2接続が使用されます。 web.configのセクションを使用するときと同じです。
リンク: <remove> connectionManagement(ネットワーク設定)の要素
それが誰かを助けることを願っています。
WCFベースのWebサービス参照を使用している可能性がありますか?デフォルトでは、 ServiceThrottlingBehavior.MaxConcurrentCalls は16です。
サービス参照動作の<serviceThrottling>
要素を更新してみてください
<serviceThrottling
maxConcurrentCalls="999"
maxConcurrentSessions="999"
maxConcurrentInstances="999" />
(上記の設定をお勧めします。)適切な<behavior>
要素を構成する方法の詳細については、 MSDN を参照してください。
静的 DefaultConnectionLimit プロパティの値をプログラムで設定しようとしましたか?
ここにその真の頭痛に関する良い情報源があります... ASP.NET IIS 7.5、IIS 7.0、およびIIS 6.0でのスレッドの使用 、フレームワーク4.0の更新。
このページの「スレッド」セクションを参照してください: http://msdn.Microsoft.com/en-us/library/ff647786.aspx 、「接続」セクションと組み合わせて。
ProcessModel設定のmaxconnection属性をアップしようとしましたか?
パフォーマンステストを行っている間、私が行った測定値はRPSです。これは、サーバーが許容可能な遅延内で1秒あたりに要求できるリクエスト数です。
理論的には、1つのサーバーは、そのコアの数と同じ数の要求のみを同時に実行できます。
潜在的に何千ものrpを処理できるため、問題はASP.netのスレッドモデルのようには見えません。問題はアプリケーションにあるようです。同期プリミティブを使用していますか?
また、あなたのウェブサービスのレイテンシーは、非常に迅速に応答しますか(マイクロ秒以内)、そうでなければ非同期呼び出しを検討したいかもしれません
これで問題が解決しない場合は、visual studioまたはredgateプロファイラーを使用してコードをプロファイリングすることをお勧めします。
Webサービスの消耗品をホストしているWebサービスまたはアプリケーションまたはサーバー(ApacheまたはIIS)で定義されていない場合、障害が発生するまで無限の接続を作成できます。