2009-11-11 37 views
2

我们有一个asp.net应用程序,它通过httpwebrequest大量使用REST/json服务,并大量使用Web缓存。看似偶尔,工作进程停止响应。浏览器坐在期待一个响应,并从来没有得到一个。只有应用程序池重启似乎可以解决问题。没有未处理的异常或我们已经注意到的任何其他异常。 cpu和内存负载很低(< 10%cpu util,> 80%可用内存)什么可以导致asp.net停止响应

我们遇到的唯一可能的提示是我们在事件日志中看到'deadlock detected'消息,但没有一致。此外,我们已经消除了我们认为是这种争用的唯一可能原因(通过开始/结束请求执行多个并发httpwebrequest)。

有什么想法?

赢得03服务器/数据中心版(在Amazon EC2) asp.net 3.5

回答

2

当你有使用低CPU无响应的应用程序,这是最有可能是并发性问题。你要么死锁会导致你所有的线程停顿,要么你的异步线程永远完成并且ThreadPool最终会挨饿。由于您运行的是ASP.Net,因此您应该检查ThreadPool的工作方式。您可以观看性能计数器,或者更好地使用windbg附加到您的应用程序(可以从Windows调试工具http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx中获得)。

启动的WinDbg,重视asp.net程序,然后在命令提示符:

.loadby mscorwks sos 
!ThreadPool 

更妙的是,下载sosex扩展(http://www.stevestechspot.com/CommentView,guid,9fdcf4a4-6e09-4807-bc31-ac1adf836f6c.aspx),并检查死锁与

!dlk 

检查哪些线程阻塞,切换到其中一个线程(使用UI或命令行)并键入

!CLRStack 

有堆栈跟踪显示哪种方法阻止您的应用程序。

+0

感谢您的工具指针(sosex)。我怀疑僵局是从一开始的,但是这让我弄清楚它是什么。简而言之,如果你有一个跟踪监听器,*和*一个跟踪appender,你可以进入死锁状态,因为system.diagnostic的东西和跟踪appender都会锁定'this'或监听器。坏。 – kolosy 2009-11-12 22:12:13

相关问题