我有一个.NET多线程应用程序。它通过网络接收和发送大量UDP数据包,并进行大量计算。
我每天都打开这个应用程序,它在整个工作时间窗口中运行。并发线程数(通过任务管理器检查)通常在60到90之间变化.CPU使用率变化很大,并且偶尔出现一些峰值,使服务器的CPU使用率达到100%。但我会说应用程序的AVERAGE CPU使用率很低,不到5%。
有时,在某些随机的日子里,通常当收到的数据包数量高于平时时,此应用程序的并发线程数会上升到~250,服务器的CPU使用率保持在100%持平。该应用程序未使用整个100%(因为此服务器上还有其他应用程序运行),但它使用了所有可用的CPU,使总利用率达到100%。
线程数不会增加,就像存在某种死锁或内存泄漏一样。但它也不会随着时间的推移而减少。该过程使用的内存也不会随着时间的推移而增加,并保持与未发生问题的日期相同的水平。
我相信源代码上可能存在一些错误,它会触发某种无限循环或类似的东西。
基于this帖子,我尝试使用微软的Debug Analysis Tool v2 Update 3,但我遇到了一些问题,我在下面描述:
1)我按照上面链接中的所有说明进行操作。我能够创建并激活规则来检测高CPU使用率。
2)然而,当问题开始发生时,我在任务管理器上看到正在创建许多新进程(与我的应用程序的进程同名),一次一个但是按顺序,所有这些进程都处于状态“暂停”。要明确:我的应用程序不会生成这些新的Suspended进程,它们是在调试诊断收集工具开始收集转储文件的数据时生成的。
3)查看DebugDiag 2 Collection工具主对话框,然后我将规则的状态视为“已完成”,即使没有明确停用规则并且问题仍然存在。
4)然后我使用DebugDiag 2 Analysis工具分析生成的转储文件。我选择“Performance Analyzers / PerfAnalysis”和所有转储文件,然后开始分析。
5)分析结果如下:
我不认为这个System.ArgumentException与我的应用程序无关。我认为异常是在分析工具中抛出的,因为它在检查堆栈跟踪时看起来像。例如,我不知道在数据收集步骤中是否生成了多个具有相同名称的进程,这导致分析工具尝试在Dictionary中添加具有相同键的多个记录。
事实是,这个问题使我无法找出问题的原因。我知道还有其他分析工具,如DotTrace和ANTS,但我真的更愿意在迁移到商业工具之前使用免费工具。我甚至联系了CodeTrack的开发者,这是免费的,看起来像一个很好的工具,但他给我的提示和建议不是很容易跟随我,因为:
所以,我想我真正的问题是:在使用MS Debug Diagnostic Tool时,有没有人知道我做错了什么(如果是这样)?我面临的问题真的是一个错误吗?是否应该在数据收集期间创建几个Suspended进程?我该如何解决这个问题并使其正常工作,以便我可以用它来调查我的问题?
即使您使用实时市场数据来提供应用程序,您也应该能够生成一些虚拟数据并将其置于一些随机循环中,以便测试您的应用程序的工作方式。
为了帮助您,我们需要查看您的一些代码。正如你在帖子中提到的那样,肯定有一些bug可能会让你的线程死掉然后这是一个很大的问题,因为你有某种僵尸进程。您的孩子流程应该进行投标并死亡。
我的建议重新检查源代码,找到关键点,尝试设置调试环境(这是至关重要的,如果您的代码有效,您无法检查生产!)