我需要帮助使用 MS 调试诊断工具来分析 CPU 使用率高的 C# 应用程序

Posted

技术标签:

【中文标题】我需要帮助使用 MS 调试诊断工具来分析 CPU 使用率高的 C# 应用程序【英文标题】:I need help using MS Debug Diagnostic Tool to profile C# app with high CPU usage 【发布时间】:2019-09-18 06:17:10 【问题描述】:

我有一个 .NET 多线程应用程序。它通过网络接收和发送大量的UDP数据包,并进行大量的计算。

我每天都打开这个应用程序,它会在整个工作时间窗口内运行。并发线程数(通过任务管理器查看)通常在 60 到 90 之间变化。CPU 使用率变化很大,并且偶尔会出现一些峰值,使服务器的 CPU 使用率达到 100%。但我会说应用程序的平均 CPU 使用率很低,不到 5%。

有时,在某些随机的日子里,通常当接收到的数据包数量比平时多时,这个应用程序的并发线程数会增加到 ~250 并且服务器的 CPU 使用率保持在 100% 不变。该应用程序没有使用全部 100%(因为该服务器上还有其他应用程序在运行),但它使用了所有可用的 CPU,使总利用率达到 100%。

线程数不会持续增加,就像出现某种死锁或内存泄漏一样。但它也不会随着时间的推移而减少。进程使用的内存也不会随着时间的推移而增加,保持在没有发生问题的日子的相同水平。

我相信源代码中可能有一些错误会触发某种无限循环或类似的东西。

根据this 的帖子,我尝试使用 Microsoft 的 Debug Analysis Tool v2 Update 3,但我遇到了一些问题,我将在下面描述:

1) 我按照上面链接中的所有说明进行操作。我能够创建并激活规则以检测高 CPU 使用率。

2) 但是,当问题开始发生时,我在任务管理器上看到正在创建许多新进程(与我的应用程序的进程同名),一次一个但按顺序创建,所有这些状态为“暂停”。需要明确的是:这些新的暂停进程不是由我的应用程序生成的,它们是由调试诊断收集工具在开始收集转储文件的数据时生成的。

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

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

5) 分析结果如下:

我认为这个 System.ArgumentException 与我的应用无关。我认为异常是在分析工具内部引发的,就像检查堆栈跟踪时一样。例如,我不知道在数据收集步骤中生成了多个同名进程这一事实是否会导致分析工具尝试在字典中添加具有相同键的多条记录。

事实上,这个问题让我无法找出问题的原因。我知道还有其他分析工具,例如 DotTrace 和 ANTS,但在迁移到商业工具之前,我真的更喜欢使用免费工具。我什至联系了CodeTrack 的开发者,它是免费的,看起来是个不错的工具,但他给我的提示和建议对我来说并不容易理解,因为:

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

所以,我想我真正的问题是:有谁知道我在使用 MS 调试诊断工具时做错了什么(如果有的话)?我面临的问题真的是一个错误吗?是否应该在数据收集期间创建几个暂停的进程?如何解决此问题并使其正常工作,以便我可以使用它来调查我的问题?

【问题讨论】:

【参考方案1】:

即使您使用实时市场数据来为您的应用提供数据,您也应该能够生成一些虚拟数据并将其放入某个随机循环中,以便测试您的应用的运行情况。

为了对您有更多帮助,我们需要查看您的一些代码。正如您在帖子中提到的那样,一定有一些错误可能不会让您的线程死亡,那么这是一个大问题,因为您有某种僵尸进程。您的子进程应该听命于自己并死去。

我的建议是重新检查源代码,找到关键点,尝试设置调试环境(这很重要,如果你的代码有效,你就不能在生产环境中检查!)

【讨论】:

感谢您的回复。为了清楚起见,那些“僵尸”进程(具有“暂停”状态的进程)不是由我的应用程序生成的,它们是由调试诊断收集工具在开始收集数据时生成的(目前问题开始发生)。至于创建调试环境,我正在尝试找出一种令人满意的方法来做到这一点,但是忠实地重新创建生产环境并不容易。【参考方案2】:

我遇到了同样的问题 - Windows 服务和 w3wp.exe 相同(重复的暂停进程和 System.ArgumentException 分析) 在我卸载 DebugDiag v2 Update 3 并安装 DebugDiag v2 Update 2 之后,它运行良好。你可以试试这个吗?

【讨论】:

以上是关于我需要帮助使用 MS 调试诊断工具来分析 CPU 使用率高的 C# 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用调试诊断工具 v2.0

本机应用工具的 Windows 检测分析

什么是调试器,它如何帮助我诊断问题?

Visual Studio 2015 诊断工具不支持当前调试配置

深入理解python虚拟机:调试器实现原理与源码分析

Arthas在线java进程诊断工具 在线调试神器