我有一个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>
7条答案
按热度按时间gfttwv5a1#
这里提供的大多数答案都是针对后端Web服务的 * 传入请求 * 数量,而不是您可以从www.example.com应用程序向后端服务发出的 * 传出请求 * 数量ASP.net。
在这里,限制请求速率的不是后端Web服务,而是调用应用程序愿意建立到同一端点(同一URL)的开放连接的数量。
可以通过将以下配置节添加到计算机的.config文件中来消除此限制:
当然,如果您愿意,您可以选择一个更合理的数字,例如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文件:
brvekthn2#
我知道这个问题可能有点老了,但是你说后端运行在同一台服务器上,这意味着在不同的端口上,可能不是默认的端口80。
我读到过在使用"connectionManagement"配置元素时,如果端口号与默认的80不同,则需要指定端口号。
链接:maxConnection setting may not work even autoConfig = false in ASP.NET
其次,如果您选择使用默认配置(address =""),并使用您自己的后端特定值进行扩展,您可能会考虑将特定值放在第一位!否则,如果发出请求, 将首先匹配,并采用默认的2个连接。就像您使用web.config中的部分一样。
链接: Element for connectionManagement (Network Settings)
希望能帮上忙。
sh7euo9m3#
您是否可能正在使用基于WCF的Web服务引用?默认情况下,ServiceThrottlingBehavior.MaxConcurrentCalls为16。
您可以尝试更新服务引用行为的
<serviceThrottling>
元素(Not我建议使用上面的设置。)有关如何配置适当的
<behavior>
元素的更多信息,请参见MSDN。vulvrdjw4#
您是否尝试过以编程方式设置静态DefaultConnectionLimit属性的值?
这里有一个很好的信息来源,关于真正的头痛... ASP.NET Thread Usage on IIS 7.5, IIS 7.0, and IIS 6.0,与框架4.0的更新。
fjnneemd5#
参见本页的“线程”部分:http://msdn.microsoft.com/en-us/library/ff647786.aspx,以及“连接”部分。
您是否尝试过提升processModel设置的maxconnection属性?
c7rzv4ha6#
如果未在托管Web服务使用项的Web服务、应用程序或服务器(apache或IIS)中定义它,则您可以创建无限连接,直到失败
zkure5ic7#
在进行性能测试时,我使用的度量标准是RPS,即服务器在可接受的延迟内每秒可以处理多少请求。
理论上,一个服务器只能同时运行与其上的核的数量一样多的请求。
看起来问题并不出在ASP.net的线程模型上,因为它可以潜在地服务于数千个rps。看起来问题可能出在您的应用程序上。您是否使用了任何同步原语?
另外,您的Web服务的延迟是多少,它们响应速度是否很快(在微秒内),如果不是,那么您可能需要考虑异步调用,这样您就不会阻塞
如果这样做没有效果,那么您可能需要使用visual studio或redgate分析器来分析代码