web-dev-qa-db-ja.com

ASP.NETアプリケーションがWebサービスに対して確立できる同時接続の数を制限しているのは何ですか?

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>
86
Rob Sobers

ここで提供される回答のほとんどは、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ファイルすべてを確認してください。

  • C:\ Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG
  • C:\ Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG
  • C:\ Windows\Microsoft.NET\Framework\v4.0.30319\Config
  • C:\ Windows\Microsoft.NET\Framework64\v4.0.30319\Config
98
BenSwayne

質問はかなり古いかもしれませんが、バックエンドが同じサーバーで実行されていると言います。これは、おそらくデフォルトのポート80以外の別のポートを意味します。

「connectionManagement」構成要素を使用するときに、デフォルトの80と異なる場合はポート番号を指定する必要があることを読みました。

リンク: ASP.NETでautoConfig = falseでもmaxConnection設定が機能しない場合があります

第二に、独自のバックエンド固有の値で拡張されたデフォルト設定(address = "*")を使用することを選択した場合、特定の値を最初に置くことを検討してください。それ以外の場合、要求が行われると、*が最初に一致し、デフォルトの2接続が使用されます。 web.configのセクションを使用するときと同じです。

リンク: <remove> connectionManagement(ネットワーク設定)の要素

それが誰かを助けることを願っています。

7
Sebastian Hek

WCFベースのWebサービス参照を使用している可能性がありますか?デフォルトでは、 ServiceThrottlingBehavior.MaxConcurrentCalls は16です。

サービス参照動作の<serviceThrottling>要素を更新してみてください

<serviceThrottling
    maxConcurrentCalls="999" 
    maxConcurrentSessions="999" 
    maxConcurrentInstances="999" />

(上記の設定をお勧めします。)適切な<behavior>要素を構成する方法の詳細については、 MSDN を参照してください。

5
Ruben

静的 DefaultConnectionLimit プロパティの値をプログラムで設定しようとしましたか?

ここにその真の頭痛に関する良い情報源があります... ASP.NET IIS 7.5、IIS 7.0、およびIIS 6.0でのスレッドの使用 、フレームワーク4.0の更新。

3
Simon Mourier

このページの「スレッド」セクションを参照してください: http://msdn.Microsoft.com/en-us/library/ff647786.aspx 、「接続」セクションと組み合わせて。

ProcessModel設定のmaxconnection属性をアップしようとしましたか?

2
Matthew Evans

パフォーマンステストを行っている間、私が行った測定値はRPSです。これは、サーバーが許容可能な遅延内で1秒あたりに要求できるリクエスト数です。

理論的には、1つのサーバーは、そのコアの数と同じ数の要求のみを同時に実行できます。

潜在的に何千ものrpを処理できるため、問題はASP.netのスレッドモデルのようには見えません。問題はアプリケーションにあるようです。同期プリミティブを使用していますか?

また、あなたのウェブサービスのレイテンシーは、非常に迅速に応答しますか(マイクロ秒以内)、そうでなければ非同期呼び出しを検討したいかもしれません

これで問題が解決しない場合は、visual studioまたはredgateプロファイラーを使用してコードをプロファイリングすることをお勧めします。

0
np-hard

Webサービスの消耗品をホストしているWebサービスまたはアプリケーションまたはサーバー(ApacheまたはIIS)で定義されていない場合、障害が発生するまで無限の接続を作成できます。

0
Frank Tudor