.net 编写长轮询WCF服务

.net 编写长轮询WCF服务,.net,asp.net,wcf,.net,Asp.net,Wcf,我一直在用WCF编写一个很长的轮询服务。我正在进行负载测试,遇到了一个问题,当我收到5000个未完成的请求时,我开始得到: The HTTP service located at (my service) is too busy. 我已经将其实现为一个WCF AsyncPattern服务,并且消耗的worker/IO线程数量仍然很低(应该如此)。句柄的数量看起来不错,等等。我想我碰到了一个反DOS限制,就是找不到它。以下是我做过的一些事情: 我已经修改了注册表,因此MaxConcurrentR

我一直在用WCF编写一个很长的轮询服务。我正在进行负载测试,遇到了一个问题,当我收到5000个未完成的请求时,我开始得到:

The HTTP service located at (my service) is too busy.
我已经将其实现为一个WCF AsyncPattern服务,并且消耗的worker/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" />

但我最终还是受到了这个限制(有问题的机器可以处理它,系统的其余部分与消息队列系统是异步的)

有人能想到别的吗

我是WindowsServer2008R2上的IIS 7.5。Asp.NET 3.5SP1


更多信息:当我收到上述错误时,ASP.NETV2.0.50727“RequestsRejected”性能计数器会跳起来。文档表明,当请求队列已满时,会发生这种情况。请求队列性能计数器为0且从不移动


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

我以前遇到过5000英镑的限额,但不幸的是,我记不起在哪里了

这有什么帮助吗?


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

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

它以各种形式大量提到了5000英镑的限额。棘手的事情似乎是,根据具体的设置(例如,.NET2、3.5、4.0、IIS6、7等),应用不同的设置

希望这有帮助。

来自:

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

对于v3.5,您也可以在aspnet.config文件中设置
。如果在这两个位置都设置了该值,则aspnet.config设置将覆盖注册表设置

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

增加HTTP.sys队列限制,默认值为1000。如果操作系统为x64,并且您的RAM大于等于2 GB,则可以将其设置为5000。如果太低,您可能会看到HTTP.sys拒绝状态为503的请求。打开IIS管理器和应用程序池的高级设置,然后更改的值“队列长度”。
如果ASP.NET应用程序正在使用web服务(WFC或ASMX)或System.Net要通过HTTP与后端通信,您可能需要增加
连接管理/maxconnection
。对于ASP.Net应用程序,自动配置功能将其限制为12个*CPU。这意味着在四进程上,最多可以有12个*4=48个并发连接到IP端点。因为这是绑定的要自动配置,在ASP.NET应用程序中增加maxconnection的最简单方法是通过编程方式设置
System.NET.ServicePointManager.DefaultConnectionLimit
,例如,从
application\u Start
。将该值设置为应用程序预期使用的并发System.NET连接数。我已将其设置为
Int32.MaxValue
并且没有任何副作用,所以您可以尝试一下——这实际上是本机HTTP堆栈WinHTTP中使用的默认值。如果您无法以编程方式设置
System.Net.ServicePointManager.DefaultConnectionLimit
,则需要禁用自动配置,但这意味着您还需要设置
maxWorkerThreads
maxIoThreads
。如果不使用classic/ISAPI模式,则不需要设置
minFreeThreads
minLocalRequestFreeThreads

您正在使用的实例模型是什么?是否有可能达到会话类型的限制?实例和并发模式的调整可能是另一个地方请看……这是一个想法。我曾一度改为InstanceContextMode=Single,ConcurrencyMode=Multiple。我已恢复为调查其他内容。但是,我认为这可能是ASP.NET节流问题。我会尝试。我是SessionMode=NotAllowed.So。不,更改并发模式没有帮助。值得一试……所以rry它没有帮助。您的服务限制设置是什么。。。