什么是限制我的ASP.NET应用程序可以对Web服务进行同时连接的数量?
我有一个ASP.NET 4.0应用程序运行在64位Windows Server 2008 R2企业计算机上的IIS 7.5上,其中包括RAM,CPU,磁盘等等。
对于每个Web请求,ASP.NET应用程序都会连接到运行在同一台计算机上的后端Web服务(通过原始套接字)。
问题:似乎有一些限制与后端Web服务同时连接的数量。 可疑的是,并发连接的数量是在16点。
我发现这篇微软的重要文章解释了如何调整IIS的设置,以适应ASP.NET应用程序,这些应用程序会发出大量的Web服务请求: http : //support.microsoft.com/?id=821268#tocHeadRef
我跟着文章的推荐,但仍然没有运气。 特别有趣的设置是maxconnection
设置,我甚至碰到了999。
任何想法还有什么可以节stream连接?
注意:当我从混合中切断IIS并让客户端直接连接到后端Web服务时,它会高兴地打开尽可能多的连接,所以我认为后端并不是瓶颈。 它必须是在IIS / ASP.NET的土地。
下面是我确定应用程序正在读取的machine.config
的相关部分(通过appcmd.exe
validation):
<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>
这里提供的大多数答案都是针对后端web服务的传入请求数量,而不是您从ASP.net应用程序到后端服务的传出请求数量。
这不是你的后端Web服务在这里限制你的请求率,它是你的调用应用程序愿意build立到相同的端点(相同的URL)的开放连接的数量。
您可以通过将以下configuration节添加到machine.config文件中来删除此限制:
<configuration> <system.net> <connectionManagement> <add address="*" maxconnection="65535"/> </connectionManagement> </system.net> </configuration>
如果你想要50或100个并发连接,你当然可以select一个更合理的数字。 但是,以上将打开它的权利最高。 您也可以为上面的开放限制规则指定一个特定的地址,而不是指明所有地址的“*”。
System.Net.connectionManagement的MSDN文档
了解.NET中ConnectManagement的另一个重要资源
希望这可以解决你的问题!
编辑:哎呀,我看你有上面你的代码中提到的连接pipe理。 我将留下我的上述信息,因为它与未来的查询者有相同的问题。 但是,请注意,目前大多数最新的服务器上都有4个不同的machine.config文件!
在32位和64位以及运行在32位和64位下的.NET Framework v4下都运行着.NET Framework v2。 根据您为应用程序池select的设置,您可以使用这四种不同的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 \ Config中
- C:\ WINDOWS \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config中
可能您可能使用基于WCF的Web服务引用? 默认情况下, ServiceThrottlingBehavior.MaxConcurrentCalls是16。
您可以尝试更新您的服务引用行为的<serviceThrottling>
元素
<serviceThrottling maxConcurrentCalls="999" maxConcurrentSessions="999" maxConcurrentInstances="999" />
(请注意,我build议上述设置。)有关如何configuration适当的<behavior>
元素的更多信息,请参阅MSDN 。
我意识到这个问题可能会比较老,但是你说后端运行在同一台服务器上。 这意味着在不同的端口,可能不是默认的端口80。
我读过,当您使用“connectionManagement”configuration元素时,如果不同于默认值80,您需要指定端口号。
LINK: 在ASP.NET中,即使autoConfig = false,maxConnection设置也可能不起作用
其次,如果您select使用自己的后端特定值扩展的默认configuration(地址=“*”),则可以考虑先将特定值放入! 否则,如果发出请求,*会首先匹配,并且采用2个连接的默认值。 就像在web.config中使用该部分一样。
LINK: 连接pipe理(networking设置)的<remove>元素
希望它可以帮助别人。
您是否尝试以编程方式设置静态DefaultConnectionLimit属性的值?
这里有一个很好的关于这个真正头痛的信息来源… IIS 7.5,IIS 7.0和IIS 6.0上的ASP.NET线程使用情况,以及框架4.0的更新。
请参阅此页面的“线程化”部分: http : //msdn.microsoft.com/en-us/library/ff647786.aspx ,以及“连接”部分。
你有没有尝试过你的processModel设置的maxconnection属性?
如果未在托pipeWeb服务消耗品的Web服务或应用程序或服务器(apache或IIS)中定义,则可以创build无限连接,直到失败
在进行性能testing时,我所采取的措施是RPS,即在可接受的延迟时间内,服务器每秒可以处理多less个请求。
从理论上来说,一台服务器只能同时运行多less个内核的请求。
看起来问题不是ASP.net的线程模型,因为它可能会服务于数千个rps。 看来问题可能是你的应用程序。 你使用任何同步原语?
还有什么是您的Web服务的延迟,他们是非常快速的响应(微秒),如果不是那么你可能要考虑asynchronous调用,所以你不会结束阻止
如果这不是yeild的东西,那么你可能想要使用visual studio或redgate分析器来剖析你的代码