iis 是什么限制了ASP.NET应用程序可以同时连接到Web服务的数量?

yjghlzjz  于 2023-01-09  发布在  .NET
关注(0)|答案(7)|浏览(158)

我有一个ASP.NET4.0应用程序运行在一台64位WindowsServer 2008 R2 Enterprise机器上的IIS7.5之上,这台机器有大量的RAM、CPU、磁盘等。
对于每个Web请求,ASP.NET应用程序都会连接到运行在同一台机器上的后端Web服务(通过原始套接字)。

**问题:**似乎存在某些限制同时连接到后端Web服务的数量的因素。可疑的是,并发连接的数量已达到16。

我在微软找到了这篇关键文章,它解释了如何调整IIS的设置以适应发出大量Web服务请求的ASP.NET应用程序: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>
gfttwv5a

gfttwv5a1#

这里提供的大多数答案都是针对后端Web服务的 * 传入请求 * 数量,而不是您可以从www.example.com应用程序向后端服务发出的 * 传出请求 * 数量ASP.net。
在这里,限制请求速率的不是后端Web服务,而是调用应用程序愿意建立到同一端点(同一URL)的开放连接的数量。
可以通过将以下配置节添加到计算机的.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文件在最新的服务器上!

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

  • C:\Windows\微软. NET\框架\v2.0.50727\配置
  • C:\Windows\微软. NET\框架64\v2.0.50727\配置
  • C:\Windows\微软. NET\框架\v4.0.30319\配置
  • C:\Windows\微软. NET\框架64\v4.0.30319\配置
brvekthn

brvekthn2#

我知道这个问题可能有点老了,但是你说后端运行在同一台服务器上,这意味着在不同的端口上,可能不是默认的端口80。
我读到过在使用"connectionManagement"配置元素时,如果端口号与默认的80不同,则需要指定端口号。
链接:maxConnection setting may not work even autoConfig = false in ASP.NET
其次,如果您选择使用默认配置(address =""),并使用您自己的后端特定值进行扩展,您可能会考虑将特定值放在第一位!否则,如果发出请求, 将首先匹配,并采用默认的2个连接。就像您使用web.config中的部分一样。
链接: Element for connectionManagement (Network Settings)
希望能帮上忙。

sh7euo9m

sh7euo9m3#

您是否可能正在使用基于WCF的Web服务引用?默认情况下,ServiceThrottlingBehavior.MaxConcurrentCalls为16。
您可以尝试更新服务引用行为的<serviceThrottling>元素

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

(Not我建议使用上面的设置。)有关如何配置适当的<behavior>元素的更多信息,请参见MSDN

vulvrdjw

vulvrdjw4#

您是否尝试过以编程方式设置静态DefaultConnectionLimit属性的值?
这里有一个很好的信息来源,关于真正的头痛... ASP.NET Thread Usage on IIS 7.5, IIS 7.0, and IIS 6.0,与框架4.0的更新。

fjnneemd

fjnneemd5#

参见本页的“线程”部分:http://msdn.microsoft.com/en-us/library/ff647786.aspx,以及“连接”部分。
您是否尝试过提升processModel设置的maxconnection属性?

c7rzv4ha

c7rzv4ha6#

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

zkure5ic

zkure5ic7#

在进行性能测试时,我使用的度量标准是RPS,即服务器在可接受的延迟内每秒可以处理多少请求。
理论上,一个服务器只能同时运行与其上的核的数量一样多的请求。
看起来问题并不出在ASP.net的线程模型上,因为它可以潜在地服务于数千个rps。看起来问题可能出在您的应用程序上。您是否使用了任何同步原语?
另外,您的Web服务的延迟是多少,它们响应速度是否很快(在微秒内),如果不是,那么您可能需要考虑异步调用,这样您就不会阻塞
如果这样做没有效果,那么您可能需要使用visual studio或redgate分析器来分析代码

相关问题