Basichttpbinding上的自托管WCF服务不支持超过1000个并发请求

时间:2010-12-23 12:52:28

标签: wcf scalability self-hosting

我自己托管了由BasicHttpBinding消费的ASMX Client的WCF服务。我正在模拟 1200个用户的并发用户负载。 service方法接受一个字符串参数并返回一个字符串。交换的数据少于10KB。通过Thread.Sleep(2000)语句将请求的处理时间固定为2秒。没什么别的。我删除了所有数据库命中/业务逻辑。

同一条代码可以运行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不匹配和大数据交换上。但从来没有进行负载测试。我已经浏览了很多,并尝试了大多数选项,包括

  1. 启用跟踪&服务器端的消息日志。但没有记录错误。
  2. 要克服端口耗尽,MaxUserPort设置为65535,TcpTimedWaitDelay设置为30秒。
  3. MaxConcurrent Calls设置为600,MaxConcurrentInstances设置为1200.
  4. 打开,关闭,发送和接收超时设置为10分钟。
  5. HTTPWebRequest KeepAlive设置为false。
  6. 过去两天我一直未能确定这个问题。

    任何帮助都将不胜感激。

    谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

netsh http show servicestate

答案 1 :(得分:0)

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

该问题与来自同一来源的连接数有关。性能基准测试工具位于具有相同IP的同一台PC上。 machine.config包含对来自同一源的连接数的约束。