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

时间:2016-09-01 14:51:38

标签: c# multithreading wcf msmq

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

我使用Windbg工具获取性能统计信息: - !线程给我以下数据: -

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没有被阻止,因为其他applivations使用相同的MSMQ并且工作正常。 其次,日志记录组件只是将消息发送给MSMQ,我们可以认为它是实际应用程序的潜在障碍。 日志记录中使用的异步代码是: -

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

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

1 个答案:

答案 0 :(得分:0)

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

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

有关详情,请点击以下链接。 https://blogs.msdn.microsoft.com/johnbreakwell/2006/09/18/insufficient-resources-run-away-run-away/