繁体   English   中英

编写长轮询WCF服务

[英]Writing Long-Polling WCF Service

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

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

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

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

我已经在Web配置中设置了服务限制,所以这不应该是一个问题。 由于这个原因,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并发请求。

来自: 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的最简单方法是以编程方式从Application_Start设置System.Net.ServicePointManager.DefaultConnectionLimit 将值设置为您希望应用程序使用的并发System.Net连接数。 我已将其设置为Int32.MaxValue而没有任何副作用,因此您可以尝试 - 这实际上是本机HTTP堆栈WinHTTP中使用的默认值。 如果您无法以编程方式设置System.Net.ServicePointManager.DefaultConnectionLimit ,则需要禁用autoConfig,但这意味着您还需要设置maxWorkerThreadsmaxIoThreads 你不会需要设置minFreeThreadsminLocalRequestFreeThreads如果你不使用经典/ ISAPI模式。

IIS是否限制了打开连接的数量? 我认为在IIS中的网站或Web应用程序上有一个设置可以做到这一点。

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

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等)

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM