2

首先,对不起,我不是很流利。

我试图弄清楚为什么我的 WCF 服务在我们有一个高调用/秒速率的环境时停止工作。我不确定只是增加超时会解决问题。

我们有 2 个网络服务:

  • 第一个托管在 IIS 7.5、Windows Server 2008 R2 Enterprise SP1 x64 上,带有 AppFabric(和 WAS)
  • 二、托管于Windows Service,Windows 2003 R2 SP1 x86

两个 Web 服务都具有最低配置:无身份验证、无交易、无特殊处理消息.. 检查绑定:

<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)(由它自己,没有我们改变任何东西。地精正在努力工作)。

AppFabric/IIS/WAS:通道net.tcp 保持下来。需要手动重启。

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

事实 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.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult 结果) 的 System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult 结果)
在 System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object [] outs, IAsyncResult result) at System.ServiceModel.Channels.ServiceChannelProxy.InvokeEndService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

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

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

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

4

2 回答 2

3

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

于 2012-09-12T09:42:42.100 回答
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

日期:

事件编号:8

任务类别:共享服务

级别:错误

关键词:经典

用户:本地服务

计算机:

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

编号: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 进程超时并最终停止响应。发生此问题时,Smsvchost.exe 进程无法将以后的请求路由到 W3wp.exe 工作进程,直到重新启动 IIS。

解决方案:

Microsoft 建议应用 Microsoft 知识库 (KB) 文章中描述的修补程序 2504602。此修补程序适用于 .NET Framework 3.0 SP2、.NET Framework 3.5 SP1 和 .NET Framework 4 中的 WCF。

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

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

于 2020-02-06T22:20:29.943 回答