我正在使用WCF编写一个长轮询服务。在进行负载测试时遇到了问题,当我达到5000个未处理请求时,出现以下错误:
The HTTP service located at (my service) is too busy.
我已经实现了一个WCF异步模式服务,消耗的工作线程/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的“请求被拒绝”性能计数器会跳高。文档指出,当请求队列已满时会发生这种情况。请求队列性能计数器为0,从未动过。
如果我增加最大工作进程数量,我可以超过5K并发请求。
...
...
- Maxim