基于基本HTTP绑定的自托管WCF服务不会';t支持超过1000个并发请求

基于基本HTTP绑定的自托管WCF服务不会';t支持超过1000个并发请求,wcf,scalability,self-hosting,Wcf,Scalability,Self Hosting,我在ASMX客户端使用的BasicHttpBinding上自托管了一个WCF服务。我正在模拟1200个用户的并发用户负载。服务方法接受一个字符串参数并返回一个字符串。交换的数据小于10KB。通过使用Thread.Sleep(2000)语句,请求的处理时间固定为2秒。没有额外的。我已经删除了所有数据库点击/业务逻辑 同一段代码对于1000个并发用户运行良好。当我将用户数增加到1200个时,出现以下错误 System.Net.WebException: The underlying connecti

我在
ASMX客户端使用的
BasicHttpBinding
上自托管了一个WCF服务。我正在模拟1200个用户的并发用户负载。服务方法接受一个字符串参数并返回一个字符串。交换的数据小于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)
这种例外情况通常在数据契约不匹配和大数据交换时报告。但在进行负载测试时,绝对不要这样做。我浏览了足够多的内容,并尝试了大多数选项,其中包括:

  • 在服务器端启用跟踪和消息日志。但没有记录错误
  • 为了克服端口耗尽,MaxUserPort设置为65535,TcpTimedWaitDelay设置为30秒
  • MaxConcurrent调用设置为600,MaxConcurrentInstances设置为1200
  • 打开、关闭、发送和接收超时设置为10分钟
  • HTTPWebRequest KeepAlive设置为false
  • 在过去的两天里,我一直无法确定这个问题

    任何帮助都将不胜感激


    多谢各位

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

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

    netsh http show servicestate
    

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


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

    Microsoft不建议使用自托管,这只是为了测试,我不知道自托管的限制(也从未见过),但您可以简单地将其设为服务主机,我认为服务主机中有一些其他选项不在自托管中,试试看,也许你的问题已经解决了。基于消息的激活、监视是我读到的一些选项,它们不是ServiceHost的一部分,而是基于WAS和IIS的主机的一部分。除此之外,我会尝试看看是否有任何自我托管的具体限制。谢谢你指出,谢谢克里斯。将运行您建议的命令。我没有补充一点。当托管在IIS上时,同样的代码可以在2000用户负载下正常工作。@Krishnan:这意味着IIS为自己配置HTTP.SYS。Chris,我正在WinXP Professional box上运行代码,但无法获取“show service state”netsh命令。我认为它仅在Win2003操作系统和更高版本上受支持,这些操作系统具有新的内核HTTT.SYS堆栈。对此我不确定。@John,你说得对。IIS在后台对HTTP.SYS进行了一些配置。注册表中有一系列与IIS6(HTTP)相关的HTTP设置可以调整。但当我在IIS上运行代码时,这些设置都没有被触及。这让我想知道WCF HTTPListener是从哪里读取其配置的?我的最新发现是,在C:\WINDOWS\system32\Logfiles\HTTPERR文件夹中记录了一个“HTTP 503 QueueFull”错误。我无法找出需要调整哪种设置才能解决此问题。@Krishnan:我想知道IIS托管环境是否比您的更高效>?我已尝试在Windows Server 2003和Windows XP Professional上使用SP2运行自托管WCF服务。使用VS2010终极评估版本(每台机器200个用户*6)模拟客户端,其中每台客户端机器都是一个WinXP框。XP Pro上的IIS 5.1对传入HTTP连接的最大数量有限制。设定在10点。我认为您遇到的错误应该是在一个XP框上,该服务托管在IIS上。但在我的例子中,它是自我托管的。