WCF 性能问题:请求停止处理

Posted

技术标签:

【中文标题】WCF 性能问题:请求停止处理【英文标题】:WCF Performance issue: requests are stopped getting processed 【发布时间】:2017-01-09 12:42:15 【问题描述】:

我在 WCF 服务中遇到了问题。它会在一段时间后停止处理请求。我们已经安排了定期自动回收(几乎每小时 4 次)来临时修复它。 我从服务器获取了内存转储,似乎 1 个线程(实际上使用企业库进行日志记录)被锁定,其他线程正在等待它,但我有点困惑。

我使用 Windbg 工具来获取性能统计数据:- !threads 给了我以下数据:-

74   60 202c 000000000f1fce10  3029220 Preemptive  0000000000000000:0000000000000000 000000000252a6b0 1     MTA (Threadpool Worker) System.Messaging.MessageQueueException 00000003ffc67350

!syncblk 给了我以下信息:-

Syncblk output

日志组件是异步的,将消息发送到 MSMQ。当外部系统异常发生时,一个线程被锁定,它显示大约 1000 个线程正在等待(syncbklk 中的 Monitorthread),所有这些都是等待进入日志记录的线程。 我不明白为什么 1 个线程被锁定拒绝其他线程,因为 MSMQ 没有被阻止,因为其他应用程序使用相同的 MSMQ 并且工作正常。 其次,日志组件只是将消息发送到 MSMQ ,我们可以认为它对实际应用程序有潜在的阻塞。 日志中使用的异步代码是:-

enter code here action = new Action<LogEntry>(Logger.Write);
            IAsyncResult iAr = action.BeginInvoke(entry, CallbackHandler, action);action.EndInvoke(iar);

请就上述问题陈述提出建议。 Exception details


【问题讨论】:

【参考方案1】:

如 windbg 工具所示,您在线程 74 上收到 System.Messaging.MessageQueueException 异常。您可以使用 windbg 工具中的 !dso 命令获取异常消息,例如“资源不足(类似的东西)。

如异常图像所示,您的线程被阻塞了,因为除非它不执行将数据发送到 MSMQ 的操作,否则它不会被释放,并且其他线程也会因为该线程而被卡住。

有关更多信息,您可以点击以下链接。 https://blogs.msdn.microsoft.com/johnbreakwell/2006/09/18/insufficient-resources-run-away-run-away/

【讨论】:

以上是关于WCF 性能问题:请求停止处理的主要内容,如果未能解决你的问题,请参考以下文章

为啥我看到 WCF 的性能比 Remoting 慢?

WCF 服务超时

如何在 WCF 中自动重新连接命名管道绑定

WCF Restful Web 服务客户端限制

C# WCF的通信模式

WCF 服务和内部客户端的性能问题