[英]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。
如果我启动最大工作进程,我可以超过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,但这意味着您还需要设置maxWorkerThreads
和maxIoThreads
。 你不会需要设置minFreeThreads
或minLocalRequestFreeThreads
如果你不使用经典/ 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.