长时间运行过程暂停

Mr.*_*ith 11 .net c# windows multithreading garbage-collection

我在Visual Studio 2010 IDE中以调试模式(F5)在Windows Server GoDaddy VPS上运行.NET 2.0控制台应用程序.

应用程序定期冻结(好像垃圾收集器暂时暂停执行)但是在极少数情况下它永远不会恢复执行!

几个月来我一直在对此进行描述,并且我的想法已经不多了.

  • 应用程序尽可能快地运行(它使用100%的CPU使用率),但处于正常优先级.它也是多线程的.
  • 当应用程序冻结时,我可以通过暂停/取消暂停进程来使用VS2010 IDE解冻它(因为它在调试器中运行).
  • 当我暂停冻结过程时,上次执行的位置似乎无关紧要.
  • 冻结时,CPU使用率仍为100%.
  • 解冻后,它会完全运行,直到下一次冻结.
  • 服务器可能在冻结之间运行70天,或者它可能只能在24小时内运行.
  • 内存使用率保持相对稳定; 没有任何内存泄漏的证据.

任何人都有任何提示,以诊断究竟发生了什么?

Han*_*ant 16

它也是多线程的

这是问题的关键部分.您正在描述多线程程序可能出错的非常典型的方式.它遇到了死锁,这是线程的典型问题之一.

它可以从信息进一步缩小,显然你的过程没有完全冻结,因为它仍然消耗100%的CPU.您的代码中可能有一个热等待循环,一个循环在另一个发出事件信号的线程上.这可能会导致一种特别令人讨厌的各种僵局,一种活锁.实时锁定对时序非常敏感,代码运行顺序的微小变化可能会将其变为实时锁定.再次退出.

实时锁非常难以调试,因为尝试这样做会使条件消失.就像附加调试器或破坏代码一样,足以改变线程时序并使其超出条件.或者在代码中添加日志记录语句,这是调试线程问题的常用策略.这会因记录开销而改变时序,这反过来会使实时锁完全消失.

讨厌的东西,不可能从像SO这样的网站获得这样的问题的帮助,因为它非常依赖于代码.通常需要彻底检查代码才能找到原因.并不是很少重写.祝它好运.

  • 做正确的事并不需要任何费用.但这不是很相关,在死锁方面考虑这个问题并不富有成效.死锁程序不会燃烧100%核心.强烈的迹象是锁定,专注于试图找到一个解释为什么你的程序完全钻孔但没有到达任何地方,你将有更好的机会诊断问题. (6认同)
  • Hmya,这对我没有帮助.我需要查看代码,我没有什么可看的.但很明显,你谈论它的方式显示了你的方法的根本缺陷.你**永远不会**"锁定资源".lock语句中使用的引用应始终是object类型的专用简单引用,其唯一的工作是跟踪代码的状态.它永远不应该是导致死锁的"资源".你无法锁定数据,你只能阻止代码. (2认同)