.net - 诊断 .Net 生产应用程序中失控的 CPU

标签 .net performance cpu

有人知道有什么工具可以帮助我找出为什么我们在托管应用程序中看到 CPU 失控吗?

寻找什么:

  1. Process explorer ,它有一个很棒的功能,可以让您查看每个线程的 CPU,但您无法获得托管堆栈跟踪。此外,它需要相当熟练的用户。

  2. Windbg + SOS ,它可能可以用来通过抓取一堆转储来弄清楚发生了什么。但自动化并非易事,而且有点繁重。

  3. 成熟的分析器(如 dottrace 或 redgate),许可很复杂,而且该工具是一种过度杀伤力,需要相当繁重的安装。

我在寻找什么:

  1. 我可以将一个简单的 exe(没有安装程序)发送给客户。他们运行 10 分钟后,会生成一个文件并发送给我。该文件包含消耗最多 CPU 的线程的详细信息及其在此期间的堆栈跟踪。

从技术上讲,我知道可以创建这样的工具(使用 ICorDebug),但如果这样的工具已经存在,我不想投入任何时间。

那么,有人知道这样的事情吗?

最佳答案

基本解决方案

  1. 获取每个托管线程的托管堆栈跟踪。
  2. basic thread statistics对于每个托管线程(用户模式和内核时间)
  3. 稍等一下
  4. 重复(1-3)
  5. 分析结果并找到消耗最大 CPU 使用量的线程,向用户呈现这些线程的堆栈跟踪。

托管与托管非托管堆栈跟踪

托管和非托管堆栈跟踪之间存在很大差异。托管堆栈跟踪包含有关实际 .Net 调用的信息,而非托管堆栈跟踪包含非托管函数指针列表。由于 .Net 是抖动的,因此在诊断托管应用程序的问题时,非托管函数指针的寻址几乎没有什么用处。

managed stack not that useful

如何获取任意 .Net 进程的非托管堆栈跟踪?

two ways您可以获得托管应用程序的托管堆栈跟踪。

  • 使用 CLR 分析(又名 ICorProfiler API)
  • 使用 CLR 调试(又名 ICorDebug API)

生产中什么更好?

与分析 API 相比,CLR 调试 API 具有非常重要的优势,它们允许您附加到正在运行的进程。在诊断生产中的性能问题时,这一点至关重要。在应用程序使用几天后,由于代码执行的某些意外分支,经常会出现 CPU 失控的情况。此时重新启动应用程序(为了分析它)不是一个选项。

cpu-analyzer.exe

因此,我编写了一个无需安装程序的小工具,并使用 ICorDebug 执行上述基本解决方案。它基于 mdbg source全部合并到一个 exe 中。

它以可配置的时间间隔(默认为 1000 毫秒)对所有托管线程进行可配置(默认为 10)数量的堆栈跟踪。

这是一个示例输出:

C:\>cpu-analyzer.exe evilapp
------------------------------------
4948
Kernel Time: 0 User Time: 89856576
EvilApp.Program.MisterEvil
EvilApp.Program.b__0
System.Threading.ExecutionContext.Run
System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal
System.Threading._ThreadPoolWaitCallback.PerformWaitCallback

... more data omitted ...

请随意尝试一下该工具。可下载from my blog .

编辑

Here is a thread展示我如何使用 cpu-analyzer 来诊断生产应用程序中的此类问题。

关于.net - 诊断 .Net 生产应用程序中失控的 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1712082/

相关文章:

c# - 如何找到字符串中的所有 CR+LF?

c# - 在 C# 中删除文本文件的第一行

ruby - 在 Rails 中使 TimeWithZone 对象变得惰性

mysql - mySQL 中的子查询结构以获得最佳性能

cpu - CPU如何执行存储在主板闪存芯片中的指令?

c# - 在实现 ASP.NET 自定义输出缓存方面需要建议

c# - AssemblyInfo 文件的版本控制和更新

javascript - JavaScript 中字符串连接的性能很糟糕?

Java获取CPU核心使用率百分比

php - 一个简单的 php/mysql 的 CPU 使用率