编写长轮询WCF服务

时间:2010-12-22 22:21:57

标签: .net asp.net wcf

我一直在WCF写一个长轮询服务。我正处于负载测试阶段,我遇到了一个问题,当我遇到5000个未完成的请求时,我开始得到:

The HTTP service located at (my service) is too busy.

我已将其实现为WCF AsyncPattern服务,并且消耗的工作线程/ IO线程数仍然非常低(就像它应该的那样)。句柄的数量看起来很好,等等。我想我碰到了一个反DOS限制而且找不到它。这是我做过的一些事情:

我修改了注册表,以便MaxConcurrentRequestsPerCPU不是问题。实际上,ASP.NET排队请求的数量保持为0。

我已经在网络配置中设置了服务限制,所以这不应该是一个问题。由于这个原因,WCF跟踪不会显示任何异常。

我正在使用不包含任何安全性等的自定义绑定。它只有编码和传输(httpTransport)。

我已经将machine.config修改为requestQueueLimit:这是来自的processModel元素:

<processModel enable="true" 
  timeout="Infinite" 
  idleTimeout="Infinite" 
  shutdownTimeout="0:00:05" 
  requestLimit="Infinite" 
  requestQueueLimit="15000" 
  restartQueueLimit="10" 
  memoryLimit="60" 
  webGarden="false" 
  cpuMask="0xffffffff" 
  userName="machine" 
  password="AutoGenerate" 
  logLevel="Errors" 
  clientConnectedCheck="0:00:05" 
  comAuthenticationLevel="Connect" 
  comImpersonationLevel="Impersonate" 
  responseRestartDeadlockInterval="00:09:00" 
  responseDeadlockInterval="00:03:00" 
  maxWorkerThreads="250" 
  maxIoThreads="250" />

但我仍然最终得到这个限制(有问题的机器可以处理它,系统的其余部分异步回到消息排队系统)。

有人能想到别的什么吗?

我是WindowsServer 2008R2上的IIS 7.5。 Asp.NET 3.5SP1。

<小时/> 更多信息:当我收到上述错误时,ASP.Net v2.0.50727“Requests Rejected”性能计数器跳了起来。文档表明当请求队列已满时会发生这种情况。请求队列perf计数器为0,从不使用。

如果我启动了最大工作进程,我可以超过5K并发请求。

4 个答案:

答案 0 :(得分:3)

来自:http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx

对于v2.0和v3.5,设置DWORD注册表值@ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0\MaxConcurrentRequestsPerCPU = 5000.重新启动IIS

对于v3.5,您也可以在aspnet.config文件中设置<system.web><applicationPool maxConcurrentRequestsPerCPU="5000"/></system.web>。如果在两个位置都设置了值,则aspnet.config设置将覆盖注册表设置。

对于v4.0,默认maxConcurrentRequestsPerCPU为5000,因此您无需执行任何操作。

增加HTTP.sys队列限制,默认值为1000.如果操作系统是x64并且您有2 GB或更多RAM,则将其设置为5000应该没问题。如果它太低,您可能会看到HTTP.sys拒绝具有503状态的请求。打开IIS管理器和应用程序池的高级设置,然后更改“队列长度”的值。 如果您的ASP.NET应用程序使用Web服务(WFC或ASMX)或System.Net通过HTTP与后端进行通信,则可能需要增加connectionManagement/maxconnection。对于ASP.NET应用程序,autoConfig功能限制为12 * #CPU。这意味着在四进制上,您最多可以与IP端点建立12 * 4 = 48个并发连接。因为这与autoConfig相关联,所以在ASP.NET应用程序中增加maxconnection的最简单方法是以编程方式设置System.Net.ServicePointManager.DefaultConnectionLimit,例如Application_Start。将值设置为您希望应用程序使用的并发System.Net连接数。我已将此设置为Int32.MaxValue并且没有任何副作用,因此您可以尝试 - 这实际上是本机HTTP堆栈WinHTTP中使用的默认值。如果您无法以编程方式设置System.Net.ServicePointManager.DefaultConnectionLimit,则需要停用autoConfig,但这意味着您还需要设置maxWorkerThreadsmaxIoThreads。如果您不使用经典/ ISAPI模式,则无需设置minFreeThreadsminLocalRequestFreeThreads

答案 1 :(得分:1)

IIS是否限制了打开连接的数量?我认为IIS中的网站或Web应用程序可以设置这样的设置。

答案 2 :(得分:1)

我发现所有不同的配置选项非常混乱,但这篇博文非常有用:

http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx

它提到了各种各样的伪装限制5000。棘手的事情似乎是根据确切的设置应用不同的设置(例如.net 2,3.5,4.0,IIS 6,7等)

希望这有帮助。

答案 3 :(得分:0)