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\斌:
- http://dotnetdebug.net/2005/11/09/exceptiondbg-v01-debug-your-exceptions/
- http://blogs.msdn.com/jmstall/archive/tags/MDbg/default.aspx
- http://blogs.msdn.com/vijaysk/archive/2009/11/04/asp-net-debugger-extension-for-iis-7.aspx
解决方案是否会简单地引用此程序集来产生所需的输出?“列出所有托管调用堆栈”操作会对为生产流量提供服务的正在运行的进程产生什么影响?