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


90

RAM、CPU、ディスクなどを備えた64ビットのWindows Server 2008 R2 EnterpriseマシンでIIS 7.5の上でASP.NET 4.0アプリケーションを実行しています。

すべてのWebリクエストで、ASP.NETアプリケーションは、同じマシン上で実行されているバックエンドWebサービス(生のソケットを介して)に接続します。

問題:バックエンドWebサービスへの同時接続数を制限するものがあるようです。疑わしいことに、同時接続数は16に達しています。

IISの設定を微調整して、多くのWebサービス要求を行うASP.NETアプリに対応する方法を説明している、Microsoftのこの重要な記事を見つけました。http//support.microsoft.com/? id = 821268#tocHeadRef

私は記事の推奨事項に従っていましたが、まだ運がありませんでした。特に興味深いmaxconnection設定は、私が999にぶつけた設定です。

他に何が接続を抑制できるかについてのアイデアはありますか?

注: IISを混在させずに、クライアントにバックエンドWebサービスに直接接続させると、必要な数の接続が問題なく開かれるため、バックエンドがボトルネックにならないことが確実です。IIS / ASP.NETランドにあるものでなければなりません。

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>

@DanBはここで良い点を持っています-同時接続数をどのように測定していますか?
Jeremy McGee

@JeremyMcGeeサーバーでTCPViewを実行して同時接続数を測定し、IISワーカープロセスによって作成されたバックエンド接続の数を確認しています。
Rob Sobers、2011年

Webクライアントは独立したマシンまたは同じマシンで実行されていますか?(クライアント側でスロットリングが行われていないことを確認しています。)
Jeremy McGee

3
@JeremyMcGee個別のマシン。マシンごとに1つのクライアントサーバー接続。また、バックエンドに直接アクセスすると(HTTPでも発生します)、ボトルネックに遭遇しないため、ネットワークのどこかにスロットルがないことがわかります。
Rob Sobers、2011年

1
ロブ、これに対する決定的な解決策を見つけたことがありますか?
electronicKT

回答:


104

ここで提供する回答のほとんどは、ASP.netアプリケーションからバックエンドサービスに送信できる発信リクエストの数ではなく、バックエンドウェブサービスへの着信リクエストの数を扱っています。

ここでリクエストレートを調整しているのはバックエンド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つの優れたリソース

これで問題が解決することを願っています!

編集:おっと、私はあなたが上記のコードで言及された接続管理を持っていることを確認します。上記の情報は、同じ問題を抱える将来の照会者に関連するものなので、そのままにしておきます。ただし、最新のサーバーには現在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

うん、私はそのベースをカバーしました。とにかくありがとう、@ BenSwayne!正しいmachine.config(64ビット4.0)を変更したことを確認しました。
Rob Sobers、2011年

@RobSobers:この場合、実装コードに少し疑わしいと思います。おそらくあなたはスレッドまたは何かを使い果たしていますか?TcpClient Webサービスの呼び出しコードをコンソールアプリにスローして、より良い要求率を達成できるかどうかを確認できますか?これは、IIS固有の構成か、より広範な.NET構成か、コードかを証明します。
BenSwayne、2011年

この行はクライアントマシンに入りますか?
Uri Abramson 2013年

ありがとうございます。設定は、codeproject.com / Articles / 133738 /…からのprocessModelの調整と組み合わさ れます。次の理由により、 "ISAPI 'C:\ windows \ Microsoft.Net \ Framework \ v2.0.050727 \ aspnet_isapi.dll'が異常と報告されました:「デッドロックが検出されました」の問題
ザコス

@BenSwayne同じ概念がSMTP接続にも適用されますか?一括メール送信アプリケーションを設計していますので、このConnectionManagementプロパティは一括メールの送信にも役立ちますか(mail.send関数にマルチスレッドを使用)。
vibs2006

7

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

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

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

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

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

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


5

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

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

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

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


私達はそうであったといいのですが、そうではありません。消費されているサービスは別のマシンのApache / Python / mod_wsgiで実行されており、Robが述べたように、それは明らかに問題ではありません。
Benjamin Pollack、2011年

サービス参照はクライアントにあります。クライアントはどのようにApacheサービスを利用していますか?
John Saunders

ジョンが言ったように:スロットリングは、Webサービスを使用するクライアントに設定されます。おそらく「あなたのサービス行動」という言葉は少し誤解を招くかもしれません。「サービス参照動作」と表現した方が意味がありますか?
ルーベン、

@johnこれはaを介して消費されますTcpClient(サービスは、WCF / SOAPなどではなく、カスタムバイナリBLOBを販売します)。これらの構成オプション、使用する場合にのみ影響を与えるようServiceHostでありTcpClient、使用する場合には影響を与えません。私は何かを逃していますか?
Benjamin Pollack、2011年

「サービス参照の追加」を使用しないのはなぜですか?
John Saunders

3

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

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


これは問題にならないと思いますが、とにかくやってみます。
Rob Sobers、2011年

これは、数年前に修正した方法です。同時実行性の問題があり、これにより問題が解決したようです。Net.ServicePointManager.DefaultConnectionLimit = 1000を使用しました。接続クラスを作成する前に設定する必要があります。
Brain2000 2017

2

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

processModel設定のmaxconnection属性をアップしてみましたか?


はい、あります。しかし、あなたが引用したその記事は、このトピックに関するこれまでの他の記事が言及maxconnectionしなかった興味深いものを指摘しています。この属性はローカル Webサービスの呼び出しには適用されないということです。この特定のケースでは、Webサービスローカルですが、サービスがローカルではない別の環境でも同じ問題があります。
Rob Sobers、2011年

@RobSobers-上記のリンクは再検討に値すると思います。次の部分を確認してくださいminLocalRequestFreeThreads- このワーカープロセスは、スレッドプール内の使用可能なスレッドの数がこの数を下回った場合、この設定を使用してlocalhost(Webアプリケーションが同じサーバー上のWebサービスを呼び出す場所)からの要求をキューに入れます。この設定はminFreeThreadsに似ていますが、localhostを使用するリクエストにのみ適用されます
Ahmad

@Ahmadうん、IセットminLocalRequestFreeThreadsだけでなく(私を参照してくださいmachine.config質問に。
ロブSobers

0

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


0

パフォーマンステストを実行しているときの基準はRPSです。これは、許容可能なレイテンシ内でサーバーが1秒あたりに処理できるリクエスト数です。

理論的には、1つのサーバーが同時に実行できるリクエストの数は、そのサーバー上のコアの数と同じです。

何千ものrpsを処理できる可能性があるため、問題はASP.netのスレッドモデルではないようです。問題はあなたのアプリケーションのようです。同期プリミティブを使用していますか?

また、Webサービスのレイテンシはどうですか、応答が非常に速い(マイクロ秒以内)か、そうでない場合は非同期呼び出しを検討する必要があるため、ブロックされないようにします。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.