gpt4 book ai didi

.net - 编写长轮询 WCF 服务

转载 作者:行者123 更新时间:2023-12-03 10:43:37 25 4
gpt4 key购买 nike

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

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

我已经将此实现为 WCF AsyncPattern 服务,并且消耗的工作线程/IO 线程的数量仍然非常低(应该如此)。句柄的数量看起来不错,等等。我想我遇到了反 DOS 限制之一,只是找不到它。以下是我做过的一些事情:

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

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

我正在使用不包含任何安全性等的自定义绑定(bind)。它所拥有的只是编码和传输(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"性能计数器跳了起来。文档表明当请求队列已满时会发生这种情况。请求队列性能计数器为 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,您也可以设置 <system.web><applicationPool maxConcurrentRequestsPerCPU="5000"/></system.web>在 aspnet.config 文件中。如果在两个位置都设置了值,则 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。这意味着在 quad-proc 上,您最多可以有 12 * 4 = 48 个到 IP 端点的并发连接。因为这与 autoConfig 相关,所以在 ASP.NET 应用程序中增加 maxconnection 的最简单方法是设置 System.Net.ServicePointManager.DefaultConnectionLimit以编程方式,来自 Application_Start , 例如。将该值设置为您希望应用程序使用的并发 System.Net 连接数。我已将此设置为 Int32.MaxValue并且没有任何副作用,因此您可以尝试一下——这实际上是 native HTTP 堆栈 WinHTTP 中使用的默认设置。如果您无法设置 System.Net.ServicePointManager.DefaultConnectionLimit以编程方式,您需要禁用 autoConfig ,但这意味着您还需要设置 maxWorkerThreadsmaxIoThreads .您无需设置 minFreeThreadsminLocalRequestFreeThreads如果您不使用经典/ISAPI 模式。

关于.net - 编写长轮询 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4514255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com