我在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>
答案 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文件:
答案 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)
看起来问题不是ASP.net的线程模型,因为它可能会服务数千个rps。似乎问题可能是您的应用程序。你在使用任何同步原语吗?
还考虑了Web服务的延迟,它们是否能够快速响应(在几微秒内),如果没有,那么您可能需要考虑异步调用,因此您不会最终阻止
如果这不是什么东西,那么你可能想要使用visual studio或redgate profiler来描述你的代码