5

MySpace.com的首席系统架构师 Dan Farino做了一个精彩的演示,展示了一个基于 Web 的堆栈转储工具,该工具对给定进程中运行的所有线程进行分类(它们在做什么、它们执行了多长时间等) .)

highscalability.com上也总结了他们的技术:

  • 性能收集器
    通过 UDP 集中收集性能数据。比 Windows 更可靠,允许任何客户端连接并查看统计信息。
  • 基于 Web 的堆栈转储工具。
    可以右键单击问题服务器并获取 .Net 托管线程的堆栈转储。过去必须 RDC 进入系统并附加调试器,然后 1/2 得到答案。缓慢、不可扩展且乏味。不仅仅是堆栈转储,还提供了有关线程正在做什么的大量上下文。故障排除更容易,因为您可以看到数据库上有 90 个线程被阻塞,因此数据库可能已关闭。
  • Web 基础堆转储工具。
    转储所有内存分配。对开发人员非常有用。节省手工操作的时间。• 探查器。从头到尾跟踪请求并生成报告。查看 URL、方法、状态,以及所有可以帮助您识别缓慢请求的内容。查看锁争用,是否有很多异常被抛出,任何可能有趣的东西。重量很轻。它在生产中的每个 VIP(100 台服务器组)的一个盒子上运行。每 10 秒采样 1 个线程。始终在后台跟踪。

问题是:为 ASP.NET 构建基于 Web 的堆栈转储工具需要哪些工具?为方便起见,我们假设目标 AppDomain 中托管的 *.aspx 能够输出该进程中的所有托管调用堆栈就足够了。

有几篇文章介绍了Mdbg(完全用 C#/IL 编写的托管代码的调试器,开始随 CLR 2 SDK 一起提供)和通常位于 C:\Program Files\Microsoft Visual Studio 8\SDK\ 中的mdbgcore程序集的使用。 v2.0\斌:

解决方案是否会简单地引用此程序集来产生所需的输出?“列出所有托管调用堆栈”操作会对为生产流量提供服务的正在运行的进程产生什么影响?

4

2 回答 2

3

我相信.Net的分析API是要走的路。

查看 Google Code 上的SlimTune项目以获取带有源的实时示例,您可以检查如何适应和改进以在 Asp.NET 场景中工作。

问候马西莫

于 2009-11-05T23:24:43.920 回答
2

使用 .Net 的分析 API,您必须停止服务器,这会占用大量 CPU(但它可以让您完全控制所有调用的方法)。

我认为最“轻松”的解决方案是使用 MDbg 来实现,我将一个非常小但很有用的小应用程序StackDump放在一起,它执行以下操作: 1) 调试器停止应用程序并生成所有运行的 CLR 堆栈的列表过程。2) 应用程序再次启动。此操作是一种快速操作,可以(可能)在运行中的生产服务器上执行,而生产代码未更改。

它只需要 80 行 .Net 代码来管理它。我已经在 Codeplex 上发布了源代码。

于 2010-02-19T23:39:18.973 回答