NetTcpBinding(WCF)中的ReliableSession发生意外故障

工作

我有一个客户端服务器应用程序。我的情况:

  • .Net Framework 4.6.1
  • 启用超线程的Quad Core i7机器
  • 服务器CPU负载从20-70%
  • 网络负载<5%(GBit NIC)
  • 100个用户
  • 正在运行30个服务(一些管理服务,每种数据类型一些通用服务),并且每个用户都连接到所有服务
  • NetTcpBinding(启用压缩)
  • 已启用ReliableSession
  • 我每秒钟都会触发一次(服务器端)更新通知,并且所有客户端都会从服务器加载大约。100 kB
  • 此外,心跳正在运行(用于测试15秒间隔),仅以UTC返回服务器时间

有时WCF连接会更改为故障状态。通常,发生这种情况时,服务器根本没有上游网络。我确实编写了一个内存转储,并且能够看到很多WCF线程正在等待一些WaitQueue调用堆栈为:

Server stack trace: 
   at System.ServiceModel.Channels.TransmissionStrategy.WaitQueueAdder.Wait(TimeSpan timeout)
   at System.ServiceModel.Channels.TransmissionStrategy.InternalAdd(Message message, Boolean isLast, TimeSpan timeout, Object state, MessageAttemptInfo& attemptInfo)
   at System.ServiceModel.Channels.ReliableOutputConnection.InternalAddMessage(Message message, TimeSpan timeout, Object state, Boolean isLast)
   at System.ServiceModel.Channels.ReliableDuplexSessionChannel.OnSend(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.DuplexChannel.Send(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.DuplexChannelBinder.Send(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

我确实进行了设置调整,看来情况已经缓解了-现在故障更少的客户。我的设置:

  • ReliableSession.InactivityTimeout:01:30:00
  • ReliableSession.Enabled:真
  • ReliableSession.Ordered:否
  • ReliableSession.FlowControlEnabled:错误
  • ReliableSession.MaxTransferWindowSize:4096
  • ReliableSession.MaxPendingChannels:16384
  • MaxReceivedMessageSize:1073741824
  • ReaderQuotas.MaxStringContentLength:8388608
  • ReaderQuotas.MaxArrayLength:1073741824

我被困住了。所有呼叫为什么试图等待一些WaitQueueTransmissionStrategy我不在乎邮件是否乱码发送(我自己会照顾的)。我已经在考虑禁用可靠的消息传递,但是该应用程序已在全球的公司网络中使用。我需要知道我的消息已经传递。

有什么想法可以教WCF仅发送消息而不关心其他事情吗?

编辑

服务限制的值设置为Int32.MaxValue

我也尝试设置MaxConnectionsListenBackLog(上NetTcpBinding)是否达到最高值。据我所知,它没有任何改变。

编辑2

检查WCF跟踪会告诉我(德语消息,因此为粗略翻译),可靠消息传递窗口中没有可用空间-然后我得到的都是超时,因为没有更多消息被发送。

发生什么事了?可靠消息传递有可能使自己迷惑吗?

工作

长话短说:

事实证明,我的WCF设置很好。

ThreadPool是限制因素。在高流量(因此高负载)的情况下,我确实会生成大量必须发送到客户端的消息。由于没有足够的工作线程发送消息,因此将它们排队。在某个时候,队列已满-在那里。

有关更多详细信息,请查看Russ Bishop的问题与解答

有趣的细节:在交通繁忙的情况下,这甚至降低了CPU负载。从30%到80%的疯狂涨幅到30%左右的(几乎)稳定值。我只能假设这是由于线程池线程的生成和清理。

编辑

我做了以下事情:

ThreadPool.SetMinThreads(1000, 500)

该值可能就像使用大锤开裂螺母一样-但它可以工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在python中读取文件时发生意外中断

在Android中绘制视图时发生意外崩溃

在lint分析module-info.class期间发生意外故障

已经需要Thor。这可能会导致Bundler发生意外故障

TCP插件发生意外错误

BaseDexClassLoader中发生意外崩溃

结帐后发生意外变化

与Stripe发生意外错误

)此时发生意外错误

Numpy阵列发生意外变化

登录错误:发生意外错误

WCF 4.5:发生意外错误:远程服务器返回了意外响应:(413)请求实体太大

XQuery发生错误时发生意外

尝试使用函数中定义的数据框名称时发生意外的NameError

Excel - 发生意外错误 - 跳转到不同工作表中的单元格

在R中管道传递给ls()时发生意外行为?

在Visual Studio 2012中为Windows桌面添加服务引用时发生意外的重构

在Java 8中使用Lambda发生意外错误

卡在ManagedBeanPreProcessingException中:处理托管bean时发生意外错误

Vue.js中“已安装” axios中发生意外的异步操作

将指针传递给go中的切片时发生意外行为

Java中的生产者/消费者代码期间发生意外异常

在100%高的容器中填充时发生意外的CSS溢出

在Objective-C中相乘时发生意外行为

比较Win 7中的目录时发生意外错误

发生意外错误:“ EPERM:纱线中不允许进行操作

在python 2.7中的getter和setter上使用属性时发生意外行为

在rpy2中使用as.Date()发生意外的行为

在python中迭代目录时发生意外行为