我有一个客户端服务器应用程序。我的情况:
有时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)
我确实进行了设置调整,看来情况已经缓解了-现在故障更少的客户。我的设置:
我被困住了。所有呼叫为什么试图等待一些WaitQueue
的TransmissionStrategy
?我不在乎邮件是否乱码发送(我自己会照顾的)。我已经在考虑禁用可靠的消息传递,但是该应用程序已在全球的公司网络中使用。我需要知道我的消息已经传递。
有什么想法可以教WCF仅发送消息而不关心其他事情吗?
编辑
服务限制的值设置为Int32.MaxValue
。
我也尝试设置MaxConnections
和ListenBackLog
(上NetTcpBinding
)是否达到最高值。据我所知,它没有任何改变。
编辑2
检查WCF跟踪会告诉我(德语消息,因此为粗略翻译),可靠消息传递窗口中没有可用空间-然后我得到的都是超时,因为没有更多消息被发送。
发生什么事了?可靠消息传递有可能使自己迷惑吗?
长话短说:
事实证明,我的WCF设置很好。
ThreadPool是限制因素。在高流量(因此高负载)的情况下,我确实会生成大量必须发送到客户端的消息。由于没有足够的工作线程发送消息,因此将它们排队。在某个时候,队列已满-在那里。
有关更多详细信息,请查看Russ Bishop的问题与解答。
有趣的细节:在交通繁忙的情况下,这甚至降低了CPU负载。从30%到80%的疯狂涨幅到30%左右的(几乎)稳定值。我只能假设这是由于线程池线程的生成和清理。
编辑
我做了以下事情:
ThreadPool.SetMinThreads(1000, 500)
该值可能就像使用大锤开裂螺母一样-但它可以工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句