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

2023-12-24

有谁知道有一个工具可以帮助我弄清楚why我们在托管应用程序中看到 CPU 失控?

我是什么not寻找:

  1. 流程浏览器 http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx,它有一个很棒的功能,可以让您查看每个线程的 CPU,但您无法获得托管堆栈跟踪。此外,它需要相当熟练的用户。

  2. 风数据库+SOS http://msdn.microsoft.com/en-us/library/bb190764.aspx,它可能可以用来通过抓取一堆转储来弄清楚发生了什么。但自动化并非易事,而且有点繁重。

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

我在寻找什么:

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

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

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


基本解决方案

  1. Grab managed每个托管线程的堆栈跟踪。
  2. Grab 基本线程统计 http://msdn.microsoft.com/en-us/library/ms683237(VS.85).aspx对于每个托管线程(用户模式和内核时间)
  3. 稍等一会
  4. 重复(1-3)
  5. 分析结果并找到消耗最大 CPU 使用量的线程,向用户呈现这些线程的堆栈跟踪。

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

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

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

two ways http://blogs.msdn.com/jmstall/archive/2004/10/22/246151.aspx您可以获得托管应用程序的托管堆栈跟踪。

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

生产上用什么比较好?

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

cpu分析器.exe

因此,我编写了一个无需安装程序的小工具,并使用 ICorDebug 执行上述基本解决方案。它基于MDBG源代码 http://blogs.msdn.com/jmstall/archive/2005/11/08/mdbg_linkfest.aspx全部合并到一个 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 ...
  

请随意尝试一下该工具。可以下载来自我的博客 http://samsaffron.com/archive/2009/11/11/Diagnosing+runaway+CPU+in+a+Net+production+application.

EDIT

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

诊断 .Net 生产应用程序中失控的 CPU 的相关文章

  • WPF 如何从 DataTemplate 访问控件

    我有一个包含网格的数据模板 网格内有一个组合框
  • 限制 LDAP 查询中返回的属性

    如何限制通过 System DirectoryServices 在 LDAP 查询中返回的属性 我一直在使用 DirectorySearcher 并将我想要的属性添加到 DirectorySearcher PropertiesToLoad
  • 如何证明 .NET CLR JIT 每次运行只编译每个方法一次?

    There s 一个老问题 https stackoverflow com questions 1255803 does the net clr jit compile every method every time 1255832每次询问
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v
  • 任务并行库周围是否有一个接口包装器,以便我可以将其交换用于单元测试?

    I asked 这个问题 https stackoverflow com questions 3362734 unit testing concurrent software what do you do不久以前 我现在知道这是一个坏主意
  • 如何对私有方法进行单元测试?

    我正在构建一个类库 它将有一些公共和私有方法 我希望能够对私有方法进行单元测试 主要是在开发时 但它也可能对未来的重构有用 这样做的正确方法是什么 如果您想对私有方法进行单元测试 则可能会出现问题 单元测试 一般来说 旨在测试类的接口 即其
  • 当用户尝试打开新实例时返回到已打开的应用程序

    这是我有一段时间想不通的问题 防止第二个实例很简单并且有很多方法 但是恢复已经运行的进程则不然 我想 最小化 撤消最小化并将正在运行的实例置于最前面 在其他窗口后面 将应用程序置于最前面 我使用的语言是 VB NET 和 C 我发现这段代码
  • 防止字符串中出现西里尔文/希腊文/中文 - C# 4.0

    我们有一个支持希腊语 西里尔语 中文字符的系统 使用 ASP NET C 4 0 但第三方系统似乎无法正常工作 为了避免为此第三方系统输入数据时出现问题 我想将文本字段限制为仅接受英语或重音字符 但返回其他字符的验证错误 我怎样才能做到这一
  • 在 C# 中在 Windows 标题栏区域中创建选项卡

    有人可以告诉我如何在 C Winforms 应用程序的标题栏区域中创建选项卡吗 我正在寻找类似于 Google Chrome 的外观 Chrome 中的每个选项卡都停靠在主应用程序窗口的标题栏中 尝试将表单的 FormBorderStyle
  • 当您在 .net 项目中添加 dll 的引用时会发生什么

    我在 net 中有一个类库项目 名为 A 构建时将创建一个 dll 即 A dll 我有另一个项目 B 该项目包含 dll A dll 的引用 当我在 B 中添加 A 的引用时到底会发生什么 谁能告诉我在编译时和运行时会发生什么 编译器将
  • PhotoChooserTask 抛出未处理的异常

    我已经有了这段代码 我使用它来显示一个按钮 该按钮允许用户从他的库中选择图像并将其用作我的应用程序的背景 所以我创建了一个PhotoChooserTask 将其设置为显示相机并将其绑定到任务完成时必须执行的方法 该按钮将通过显示PhotoC
  • 如何对ArrayList(int)进行排序

    我怎样才能排序Arraylist按升序和降序排列 例子 ArrayList list new ArrayList list Add 2 list Add 8 list Add 0 list Add 1 如何按升序和降序对上面的列表进行排序
  • 在 .NET 并发线程之间传递数据的最佳方式是什么?

    我有两个线程 一个需要轮询一堆单独的静态资源以查找更新 另一种需要获取数据并将其存储在数据库中 线程1如何告诉线程2有东西要处理 如果数据块是独立的 则将数据块视为要由线程池处理的工作项 使用线程池和QueueUserWorkItem将数据
  • 编写此代码片段的有效方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 更有效和 或更短地重写此代码以节省字节并显得不那么冗长的方法 if N 2 0 N 6 N 8 N 10 N 12 N 14 N 16 N
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • jQuery 选择器:为什么 $("#id").find("p") 比 $("#id p") 更快

    该页面的作者 http 24ways org 2011 your jquery now with less suck http 24ways org 2011 your jquery now with less suck断言 jQuery
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • 如何在网页上实现文件上传进度条?

    当用户将文件上传到我的网络应用程序时 我想显示比动画 gif 更有意义的内容 我还有哪些可能性 编辑 我正在使用 Net 但我不介意是否有人向我展示与平台无关的版本 如果您对这一切在客户端通常如何工作感兴趣 就是这样 所有解决方案都通过 J
  • 调试VS 2005提示“操作不支持”

    我一直在调试 VS 2005 并将 启动外部程序 设置为 C Program Files Microsoft Visual Studio 10 0 Common7 IDE devenv exe 但按 F5 后出现此错误 尝试运行项目时出错
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐