我需要帮助使用MS Debug Diagnostic Tool来分析CPU使用率高的C#app

问题描述 投票:1回答:1

我有一个.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进程,它们是在调试诊断收集工具开始收集转储文件的数据时生成的。

enter image description here

3)查看DebugDiag 2 Collection工具主对话框,然后我将规则的状态视为“已完成”,即使没有明确停用规则并且问题仍然存在。

enter image description here

4)然后我使用DebugDiag 2 Analysis工具分析生成的转储文件。我选择“Performance Analyzers / PerfAnalysis”和所有转储文件,然后开始分析。

5)分析结果如下:

enter image description here

我不认为这个System.ArgumentException与我的应用程序无关。我认为异常是在分析工具中抛出的,因为它在检查堆栈跟踪时看起来像。例如,我不知道在数据收集步骤中是否生成了多个具有相同名称的进程,这导致分析工具尝试在Dictionary中添加具有相同键的多个记录。

事实是,这个问题使我无法找出问题的原因。我知道还有其他分析工具,如DotTrace和ANTS,但我真的更愿意在迁移到商业工具之前使用免费工具。我甚至联系了CodeTrack的开发者,这是免费的,看起来像一个很好的工具,但他给我的提示和建议不是很容易跟随我,因为:

  • 我的应用程序在生产服务器上运行。
  • 在测试机器中模拟生产环境并不简单,因为我使用实时市场数据来提供应用程序。
  • 在任何人建议使用Visual Studio自己的分析工具之前,生产服务器没有安装VS(我不打算在它上面安装它)。

所以,我想我真正的问题是:在使用MS Debug Diagnostic Tool时,有没有人知道我做错了什么(如果是这样)?我面临的问题真的是一个错误吗?是否应该在数据收集期间创建几个Suspended进程?我该如何解决这个问题并使其正常工作,以便我可以用它来调查我的问题?

c# multithreading performance cpu-usage debugdiag
1个回答
0
投票

即使您使用实时市场数据来提供应用程序,您也应该能够生成一些虚拟数据并将其置于一些随机循环中,以便测试您的应用程序的工作方式。

为了帮助您,我们需要查看您的一些代码。正如你在帖子中提到的那样,肯定有一些bug可能会让你的线程死掉然后这是一个很大的问题,因为你有某种僵尸进程。您的孩子流程应该进行投标并死亡。

我的建议重新检查源代码,找到关键点,尝试设置调试环境(这是至关重要的,如果您的代码有效,您无法检查生产!)

© www.soinside.com 2019 - 2024. All rights reserved.