WCF + NetTcp:高负载使通道停止工作(通话/秒速率)

时间:2012-09-11 21:04:48

标签: wcf performance load nettcpbinding

首先,抱歉,我不会流利。

我正在试图找出为什么我们的WCF服务在我们拥有高通话/秒速率的环境时停止工作。我不确定只是增加超时会解决问题。

我们有2个网络服务:

  • 第一个托管在IIS 7.5,Windows Server 2008 R2 Enterprise SP1 x64上,使用AppFabric(和WAS)
  • 其次,托管在Windows服务,Windows 2003 R2 SP1 x86

两个webservices都具有最低配置:无身份验证,无trasaction,无需特殊处理消息..检查绑定:

<netTcpBinding>
    <binding  transactionFlow="false">
      <security mode="None">
        <message clientCredentialType="None" />
        <transport clientCredentialType="None"></transport>
      </security>
      <reliableSession enabled="false"/>
    </binding>
  </netTcpBinding>

我们正在尝试使用Net.Tcp绑定,因为它的可行性和速度。

事实1 - Net.Tcp绑定是主要原因

当负载很高时,通道Net.Tcp停止工作。而已!但BasicHttp仍然像一个魅力。

WindowsService:频道net.tcp持续了几分钟(3m - 10m)然后才开始工作(BY ITSELF,我们没有改变任何东西。 Goblins正在努力)。

AppFabric / IIS / WAS:频道net.tcp保持不变。需要手动重启。

BasicHttpBinding配置类似于net.tcp:没有任何消息处理,没有安全问题或类似的事情。

FACT 2 - 没有任何记录

我们找不到任何善意,小费,技巧来弄清楚发生了什么。我试过转储内存,事件日志,System.Diagnostics并没有任何相关性。最相关的提示是SMSvcHost 4.0.0.0中的错误:

  

调度重复的套接字时发生错误:此句柄   现在已经泄露了。 ID:2272来源:   System.ServiceModel.Activation.TcpWorkerProcess / 62875109异常:   System.TimeoutException:此请求操作发送到   http://schemas.microsoft.com/2005/12/ServiceModel/Addressing/Anonymous   在配置的超时(00:01:00)内没有收到回复。该   分配给此操作的时间可能是更长时间的一部分   超时。这可能是因为该服务仍在处理中   操作或因为服务无法发送回复消息。   请考虑增加操作超时(通过强制转换   通道/代理到IContextChannel并设置OperationTimeout   property)并确保该服务能够连接到   客户端。

     

服务器堆栈跟踪:at   System.Runtime.AsyncResult.End [TAsyncResult](IAsyncResult结果)
  在   System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult   结果)在   System.ServiceModel.Channels.ServiceChannel.EndCall(String action,   对象[]出,IAsyncResult结果)at   System.ServiceModel.Channels.ServiceChannelProxy.InvokeEndService(IMethodCallMessage   methodCall,ProxyOperationRuntime operation)at   System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天   消息)

     

在[0]处重新抛出异常:at   System.Runtime.AsyncResult.End [TAsyncResult](IAsyncResult结果)
  在   System.ServiceModel.Activation.WorkerProcess.EndDispatchSession(IAsyncResult的   结果)进程名称:SMSvcHost进程ID:1532

您是否有任何提示或配置技巧可以帮助我解决此问题?

高负载情况下的最佳配置是什么?

2 个答案:

答案 0 :(得分:3)

如果您在Visual Studio或svcutil工具中生成了服务引用,请确保始终调用代理的Close或Abort方法。我几天前遇到了类似的问题,因为我忘了称这些方法。

答案 1 :(得分:0)

如果您要相应地调用Close()和Abort()方法,但仍然收到此错误,请考虑以下情形:

  1. 您运行基于Microsoft .NET Framework 3.0或基于.NET Framework 3.5的Windows Communication Foundation(WCF)服务。

  2. WCF服务使用Net.Tcp端口共享服务(Smsvchost.exe),并托管在运行Internet信息服务(IIS)的计算机上。

  3. 满足以下条件之一:

    • 运行IIS的计算机上的CPU使用率很高。
    • 在WCF服务的服务模型中发生了调节。
    • 多个请求同时发送到WCF服务。

在这种情况下,WCF服务需要超过一分钟的时间来处理来自客户端应用程序的请求。此外,在事件日志中会记录一条组合以下事件条目的错误消息:

日志名称:系统

来源:SMSvcHost 3.0.0.0

日期:

事件ID:8

任务类别:共享服务

级别:错误

关键字:经典

用户:本地服务

计算机:

说明:分派重复的套接字时发生错误:此句柄现在在进程中泄漏。

ID:2620

来源:System.ServiceModel.Activation.TcpWorkerProcess

例外:

System.TimeoutException:发送到此请求的请求操作在配置的超时(00:01:00)内未收到答复。分配给该操作的时间可能是较长超时的一部分。这可能是因为该服务仍在处理该操作,或者是因为该服务无法发送回复消息。请考虑增加操作超时(通过将通道/代理转换为IContextChannel并设置OperationTimeout属性),并确保该服务能够连接到客户端。

注意:,您必须重新启动IIS,才能从此问题中恢复WCF服务。

原因:

发生此问题的原因是,当Smsvchost.exe进程尝试将传入的连接请求传输到W3wp.exe工作进程时,在一分钟后超时。 此外,此超时不可配置

当CPU负担很重时,或者当传入许多并发连接请求时,Smsvchost.exe进程无法在一分钟内将传入的连接转移到W3wp.exe工作进程。因此,Smsvchost.exe进程超时并最终停止响应。发生此问题时,除非重新启动IIS,否则Smsvchost.exe进程无法将以后的请求路由到W3wp.exe工作进程。

解决方案:

Microsoft建议应用Microsoft知识库(KB)文章中介绍的热修复2504602。此热修复程序可用于.NET Framework 3.0 SP2,.NET Framework 3.5 SP1和.NET Framework 4中的WCF。

此外,Microsoft声称已在.Net Framework 4.5中解决了此问题,因此,您应该升级到最新版本。

如果您升级到.Net Framework 4.5,并且问题仍然存在,则解决方法是修改smsvchost.exe.config文件以增加超时和挂起的接受以及其他各种参数。

相关问题