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

问题描述:

首先,对不起,我不流利。WCF + NetTcp:高负载使通道停止工作(通话/秒速率)

我想弄清楚为什么我的WCF服务停止工作时,我们有一个高通话/秒率的环境。我不确定只是增加超时将解决问题。

我们有2个web服务:

  • 首先是在IIS 7.5托管,在Windows Server 2008 R2企业版SP1 64位,与AppFabric的(和WAS)
  • 二,托管在Windows服务时,Windows 2003 R2 SP1 x86的

两个web服务具有最低配置:不认证,不trasaction,不需特殊治疗的消息..检查结合:

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

我们试图使用Net.Tcp绑定,因为它的可靠性和速度。

FACT 1 - net.tcp绑定是主要原因

当负载较高时,信道的net.tcp停止工作。而已!但BasicHttp仍然像魅力一样工作。

WindowsService:通道net.tcp在返回工作前持续几分钟(3m - 10m)(BY AREELF,没有我们改变任何东西。哥布林正在努力工作)。

AppFabric/IIS/WAS:通道net.tcp保持关闭状态。需要手动重启。

的basicHttpBinding的配置类似于的net.tcp:没有任何处理的消息,whitout安全问题或类似的东西。

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 属性),并确保服务能够连接到 客户端。

服务器堆栈跟踪:在 System.Runtime.AsyncResult.End [TAsyncResult](IAsyncResult的结果)
处 System.ServiceModel System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult 结果)。 Channels.ServiceChannel.EndCall(字符串动作, 对象[]奏,IAsyncResult的结果)在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeEndService(IMethodCallMessage 包括methodCall,ProxyOperationRuntime操作)在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天 消息)

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

您有任何提示或配置方法可以帮助我解决此问题吗?

什么是高负载场​​景的最佳配置?

+0

只有一个评论,但我的猜测是IIS排队HTTP而不是TCP – Paparazzi

+0

您是否尝试过WCF跟踪? http://msdn.microsoft.com/en-us/library/ms733025.aspx –

+0

你是如何产生沉重的负载?和多少负载? (10个呼叫/秒,100个呼叫/秒,500个呼叫/秒...)。多久采取你的方法?正如schglurps所说,你可能已经达到WCF中最大并发呼叫/会话/实例的限制。 – Cybermaxs

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

+0

你是对的!新的消费者不会“中止”/关闭连接。你(或某人)是否知道消费者的其他技术(如Java/Php)是否可以正确处理中止/关闭?非常感谢。接下来的两周我们将检查我们服务的所有消费者。如果在这次变更之后,我们不会遇到更多相关问题,我会将此答案标记为正确。非常感谢。 –

+0

我不认为Java/PHP客户端可以做到这一点。最好的选择可能是为你的服务创建一个新的BasicHttpBinding端点,并且告诉你的Java/PHP客户端使用这个特定的端点。 – schglurps

+0

你说得对。我已经对我的Windows服务net.tcp做了性能测试,最近启用了wcf。我们使用和不使用Close()方法的区别是显而易见的。谢谢你的提示!! –