基于基本 HTTP 绑定的 SelfHosted WCF 服务不支持超过 1000 个并发请求

Posted

技术标签:

【中文标题】基于基本 HTTP 绑定的 SelfHosted WCF 服务不支持超过 1000 个并发请求【英文标题】:A SelfHosted WCF Service over Basic HTTP Binding doesn't support more than 1000 concurrent requests 【发布时间】:2011-05-29 23:13:48 【问题描述】:

我在BasicHttpBinding 上自行托管了一个由ASMX Client 使用的WCF 服务。我正在模拟 1200 个用户 的并发用户负载。 service 方法接受一个字符串参数并返回一个字符串。交换的数据小于10KB。使用 Thread.Sleep(2000) 语句将请求的处理时间固定为 2 秒。没有额外的东西。我已删除所有 DB Hits / 业务逻辑。

同一段代码对于 1000 个并发用户运行良好。当我将数量增加到 1200 个用户时,我收到以下错误。

System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)
   --- End of inner exception stack trace ---
   at System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at WCF.Throttling.Client.Service.Function2(String param)

DataContract 不匹配和大数据交换时经常报告此异常。但是在进行负载测试时永远不会。我已经浏览了足够多的选项并尝试了大多数选项,其中包括,

    在服务器端启用了跟踪和消息日志。但没有记录错误。 为了克服端口耗尽,MaxUserPort 设置为 65535,TcpTimedWaitDelay 30 秒。 MaxConcurrent Calls 设置为 600,MaxConcurrentInstances 设置为 1200。 打开、关闭、发送和接收超时设置为 10 分钟。 HTTPWebRequest KeepAlive 设置为 false。

过去两天我一直无法确定这个问题。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

微软不推荐自托管,它只是为了测试,我不知道自托管的限制(并且从未见过)但是您可以简单地使其成为服务主机,我认为有服务主机中的一些其他选项不在自主机中,尝试一下,可能会解决您的问题。 基于消息的激活、监控是我读过的一些选项,它们不是 ServiceHost 的一部分,否则它们是基于 WAS 和 IIS 的托管的一部分。除此之外,我会尝试查看自托管是否有任何特定限制。感谢您指出。 【参考方案1】:

如果服务端 WCF 日志中没有错误,我怀疑您在 HTTP.SYS 驱动程序层中遇到了某种限制,导致请求在服务应用程序看到它们之前被拒绝。我认为特定应用程序的请求队列中的默认限制可能是 1000。

我不是 HTTP.SYS 方面的专家,但您可以通过运行获得一些见解:

netsh http show servicestate

【讨论】:

谢谢克里斯。将运行您建议的命令。我错过了补充一点。当托管在 IIS 上时,相同的代码适用于 2000 个用户负载,没有任何问题。 @Krishnan:这意味着 IIS 为自己配置 HTTP.SYS。 克里斯,我在 WinXP Professional 机器上运行代码,但无法获得“显示服务状态”netsh 命令。我认为它只支持 Win2003 操作系统及更高版本,具有新的 KERNEL HTTT.SYS 堆栈。不确定。 @John,你是对的。 IIS 在后台对 HTTP.SYS 进行了一些配置。注册表中有一堆与 IIS6 (HTTP) 相关的 HTTP 设置可以调整。但是当我在 IIS 上运行代码时,甚至没有触及这些设置。这让我想知道 WCF HTTPListener 是否正在读取其配置?我的最新发现是,在 C:\WINDOWS\system32\Logfiles\HTTPERR 文件夹中记录了“HTTP 503 QueueFull”错误。我无法找出需要调整哪个设置来解决此问题。 @Krishnan:我想知道 IIS 托管环境会不会比你的更高效>?【参考方案2】:

我在不同的服务器上看到过类似的问题,具体取决于它们的 CPU 和 RAM。您没有提及服务器类型,如何升级(XP Pro 或 Server 2003 升级到 Server 2008)等。我解决问题的方法是通过检查 x:\Windows\Microsoft.NET\Framework[version] \config\machine.config。显然,通过 IIS 选择“无限”连接并不意味着“无限”连接。在完全相同的毫秒内发出 11 个请求后,我遇到的连接数错误。

问题与来自同一来源的连接数有关。性能基准测试工具驻留在具有相同 IP 的同一台 PC 上。 machine.config 包含对来自同一源的连接数的限制。

【讨论】:

我尝试在 Windows Server 2003 和带有 SP2 的 Windows XP Professional 上运行自托管 WCF 服务。客户端使用VS2010 ULTIMATE评估版(每台机器200个用户*6)模拟,其中每台客户端机器是一个WinXP Box。对于 XP Pro 上的 IIS 5.1,传入 HTTP 连接的最大数量有限制。它设置为 10。我认为您遇到的错误应该是在服务托管在 IIS 上的 XP Box 上。但就我而言,它是自托管的。

以上是关于基于基本 HTTP 绑定的 SelfHosted WCF 服务不支持超过 1000 个并发请求的主要内容,如果未能解决你的问题,请参考以下文章

SelfHosted AspNet WebAPI 与不同项目中的控制器类

为什么我的WSDL仍然显示基本的http绑定与http的位置值?

SpringMVC Databinding(数据绑定)

基于 IIS 绑定将 WCF 端点动态绑定到 HTTPS

apache分别基于三种方案实现tomcat的代理负载均衡及会话绑定

WPF Prism框架下基于MVVM模式的命令绑定事件