什么限制了我的ASP.NET应用程序可以对Web服务进行的同时连接的数量?

时间:2011-10-21 13:12:56

标签: asp.net web-services iis

我在64位Windows Server 2008 R2企业版机器上运行IIS 7.5上的ASP.NET 4.0应用程序,其中包含大量的RAM,CPU,磁盘等。

对于每个Web请求,ASP.NET应用程序都连接到后端Web服务(通过原始套接字),该服务在同一台机器上运行。

问题:似乎存在限制后端Web服务的同时连接数的问题。可疑的是,并发连接数达到了16个。

我发现Microsoft的这篇重要文章解释了如何调整IIS的设置以容纳产生大量Web服务请求的ASP.NET应用程序: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>

7 个答案:

答案 0 :(得分:97)

此处提供的大部分答案都解决了您的后端Web服务的传入请求的数量,而不是您可以从ASP.net应用程序进行的传出请求的数量你的后端服务。

这不是你的后端网络服务限制你的请求率,它是你的调用应用程序愿意建立到同一端点(相同的URL)的开放连接数。

您可以通过将以下配置部分添加到machine.config文件来删除此限制:

<configuration>
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="65535"/>
    </connectionManagement>
  </system.net>
</configuration>

如果你想要50或100个并发连接,你当然可以选择一个更合理的数字。但是上面会打开它直到最大。您还可以为上面的开放限制规则指定特定地址,而不是指示所有地址的“*”。

MSDN Documentation for System.Net.connectionManagement

Another Great Resource for understanding ConnectManagement in .NET

希望这能解决你的问题!

编辑:糟糕,我确实看到您在上面的代码中提到了连接管理。我将留下我的上述信息,因为它与未来的查询者有相同的问题。但是,请注意目前最新的服务器上有4个不同的machine.config文件!

在32位和64位下运行.NET Framework v2以及在32位和64位下运行的.NET Framework v4。根据您为应用程序池选择的设置,您可以使用这4个不同的machine.config文件中的任何一个!请检查通常位于此处的所有4个machine.config文件:

  • C:\的Windows \ Microsoft.NET \框架\ V2.0.50727 \ CONFIG
  • C:\的Windows \ Microsoft.NET \ Framework64 \ V2.0.50727 \ CONFIG
  • C:\的Windows \ Microsoft.NET \框架\ v4.0.30319 \配置
  • C:\的Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \配置

答案 1 :(得分:7)

我意识到问题可能相当陈旧,但你说后端运行在同一台服务器上。这意味着在不同的端口上,可能不是默认端口80。

我已经读过,当您使用“connectionManagement”配置元素时,如果端口号与默认值80不同,则需要指定端口号。

LINK:maxConnection setting may not work even autoConfig = false in ASP.NET

其次,如果您选择使用使用您自己的后端特定值扩展的默认配置(address =“*”),您可以考虑将特定值放在第一位!否则,如果发出请求,则*首先匹配,并且默认采用2个连接。就像在web.config中使用该部分一样。

LINK:<remove> Element for connectionManagement (Network Settings)

希望它有所帮助。

答案 2 :(得分:5)

您是否有可能使用基于WCF的Web服务引用?默认情况下,ServiceThrottlingBehavior.MaxConcurrentCalls为16。

您可以尝试更新服务引用行为<serviceThrottling>元素

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

(请注意,我建议使用上述设置。)有关如何配置相应<behavior>元素的详细信息,请参阅MSDN

答案 3 :(得分:3)

您是否尝试以编程方式设置静态DefaultConnectionLimit 属性的值?

以下是有关真正令人头疼的问题的良好信息来源...... ASP.NET Thread Usage on IIS 7.5, IIS 7.0, and IIS 6.0,以及框架4.0的更新。

答案 4 :(得分:2)

请参阅本页的“线程”部分:http://msdn.microsoft.com/en-us/library/ff647786.aspx,并结合“连接”部分。

您是否尝试过使用processModel设置的maxconnection属性?

答案 5 :(得分:0)

如果未在托管Web服务耗材的Web服务或应用程序或服务器(apache或IIS)中定义,则可以创建无限连接,直到失败

答案 6 :(得分:0)

在进行性能测试时,我所采取的措施是RPS,即服务器在可接受的延迟范围内每秒可以提供多少请求。

从理论上讲,一台服务器只能同时运行多少个内核请求。

看起来问题不是ASP.net的线程模型,因为它可能会服务数千个rps。似乎问题可能是您的应用程序。你在使用任何同步原语吗?

还考虑了Web服务的延迟,它们是否能够快速响应(在几微秒内),如果没有,那么您可能需要考虑异步调用,因此您不会最终阻止

如果这不是什么东西,那么你可能想要使用visual studio或redgate profiler来描述你的代码