什么限制了我的ASP.NET应用程序可以与Web服务建立的同时连接数?


90

我有一个在64位Windows Server 2008 R2 Enterprise计算机上的IIS 7.5上运行的ASP.NET 4.0应用程序,其中包含大量的RAM,CPU,磁盘等。

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

问题:似乎有一些限制同时连接到后端Web服务的数量。令人怀疑的是,并发连接数已达到16。

我从Microsoft找到了这篇关键文章,解释了如何调整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>

@DanB在这里有一个好处-您如何测量并发连接的数量?
杰里米·麦基

@JeremyMcGee我正在通过在服务器上运行TCPView来查看IIS工作进程建立了多少个后端连接,从而测量并发连接数。
罗伯·索伯斯

Web客户端是在独立计算机上还是在同一台计算机上运行?(检查是否没有客户端节流。)
Jeremy McGee

3
@JeremyMcGee单独的机器。每台计算机1个客户端-服务器连接。此外,我们知道网络上没有任何限制,因为当我们直接访问后端(也通过HTTP进行)时,我们不会遇到瓶颈。
罗伯·索伯斯

1
Rob,您是否找到了解决方案?
electronicKT

Answers:


104

此处提供的大多数答案都是针对后端Web服务的传入请求数,而不是您可以从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的另一个重要资源

希望这能解决您的问题!

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

.NET Framework v2在32位和64位下均可运行,.NET Framework v4在32位和64位下均可运行。根据您为应用程序池选择的设置,您可以使用这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)。
罗布·索伯斯

@RobSobers:在这种情况下,我会对实现代码有些怀疑。也许您用完了线程之类的东西?您可以将TcpClient Web服务调用代码放入控制台应用程序,看看是否可以实现更高的请求率吗?这将证明它是IIS特定配置还是更广泛的.NET配置或您的代码。
BenSwayne 2011年

此行是否进入客户端计算机?
Uri Abramson

谢谢你,你的设置与中processModel twekaing组合从codeproject.com/Articles/133738/... 固定的“ISAPI‘C:\ WINDOWS \ Microsoft.Net \框架\ v2.0.050727 \ ASPNET_ISAPI.DLL’本身报告为不健康的原因如下:“检测到死锁”问题
Zakos 2015年

@BenSwayne同样的概念也适用于SMTP连接吗?我正在设计一个批量电子邮件发送应用程序,因此,该ConnectionManagement属性在发送批量邮件(对mail.send函数使用多线程)中也将很有用吗?
vibs2006 '16

7

我意识到这个问题可能已经很老了,但是您说后端在同一台服务器上运行。这意味着可能位于默认端口80以外的其他端口上。

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

链接:maxConnection设置甚至在ASP.NET中即使autoConfig = false也不起作用

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

LINK:<remove>用于连接管理的元素(网络设置)

希望它可以帮助某人。


5

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

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

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

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


我希望我们曾经是,但事实并非如此。正在使用的服务正在另一台机器上的Apache / Python / mod_wsgi中运行,并且正如Rob所提到的,这显然不是问题所在。
本杰明·波拉克

服务参考在客户端上。您的客户端如何使用Apache服务?
约翰·桑德斯,

就像John所说的:节流是在使用Web服务的客户端上进行的。短语“您的服务行为”可能有点误导。用“您的服务参考行为”表述是否更有意义?
鲁宾

@john通过TcpClient(服务出售自定义二进制blob,而不是WCF / SOAP或类似的东西)来使用。如果您使用这些配置选项,似乎只是在影响您ServiceHost,而不是TcpClient;我错过了什么吗?
本杰明·波拉克

为什么不使用“添加服务参考”?
约翰·桑德斯

3

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

这是有关真正令人头疼的好信息。... IIS 7.5,IIS 7.0和IIS 6.0上的ASP.NET线程使用以及针对框架4.0的更新。


我想这应该没关系,但是我还是要尝试一下。
罗布·索伯斯

这就是几年前我们修复它的方式。我们遇到了并发问题,这似乎可以解决。我们使用的是Net.ServicePointManager.DefaultConnectionLimit = 1000。您必须在创建连接类之前进行设置。
Brain2000

2

请参阅此页的“线程”部分:http : //msdn.microsoft.com/zh-cn/library/ff647786.aspx和“连接”部分。

您是否尝试增加processModel设置的maxconnection属性?


是的,我有。但是您引用的那篇文章指出了与该主题有关的其他文章所忽略的一些有趣的事情:该maxconnection属性不适用于本地 Web服务调用。在这种特殊情况下,Web服务本地的,但是在另一个服务不是本地的环境中,我们也会遇到同样的问题。
罗伯·索伯斯

@RobSobers-我认为上面的链接值得一看。检查有关的部分minLocalRequestFreeThreads- 如果线程池中的可用线程数低于此数目,则此工作进程使用此设置将来自localhost(Web应用程序在同一服务器上调用Web服务)的请求排队。此设置类似于minFreeThreads,但仅适用于使用localhost的请求
艾哈迈德(Ahmad)

@Ahmad啊,我设置minLocalRequestFreeThreads以及(见我machine.config的问题。
罗布解酒

0

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


0

在进行性能测试时,我采用的衡量标准是RPS,即服务器可以在可接受的延迟范围内每秒处理多少个请求。

从理论上讲,一台服务器只能同时运行与其上的内核数量一样多的请求。

看起来问题不是ASP.net的线程模型,因为它可以服务数千个rp。看来问题可能出在您的应用程序上。您是否使用任何同步原语?

还有Web服务的延迟是多少,它们是否很快(在微秒内)响应,如果不是,那么您可能要考虑异步调用,因此最终不会阻塞

如果这没什么用,那么您可能想使用Visual Studio或redgate profiler对代码进行概要分析

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.