基于基本 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的位置值?