如何对正在运行的ASP.NET应用程序进行非侵入性分析?

时间:2009-11-27 13:46:20

标签: .net asp.net profiling monitoring

情况:偶尔太忙的ASP.NET直播网站。

为代码添加完整的分析对性能影响太大。使用性能监视器,我们很快在“所有堆中的字节数”计数器中找到了一个锯齿形图,它与GC计数器配对。我们认为某些代码是罪魁祸首。

是否存在暂时“注入”分析的方法或可能性,对于某些页面,库,函数或其他什么?优选地尽可能轻,因为任何额外的开销可能会使这个脆弱的系统失效。我知道.NET不支持方法回调挂钩(就像AOP一样)。

4 个答案:

答案 0 :(得分:2)

一些想法:

  1. 使用自定义Windows性能计数器。它们非常轻便(1%到2%),您可以使用它们,不仅可以计数,还可以用于定时测量,查看某些操作的频率低于阈值等等。
  2. 如果您使用的是IIS 7,则可以启用“失败的请求跟踪”。要限制性能影响,请注意不要为太多页面启用它。这些跟踪可以提供大量细节,如果需要,您可以通过编程方式向其中注入更多信息。
  3. 使用Windows事件日志在特殊情况下编写自定义详细信息。只要你不过度,Perf的影响是微乎其微的。
  4. 锯齿内存行为的一个原因可能是你应该(或者在使用语句中包装IDisposable对象时调用Dispose()),它会为你调用它;您可能希望查看代码以查找该内容。
  5. 如果它有用,您可能也会对我的书中的效果提示感兴趣:Ultra-Fast ASP.NET

    编辑:您也可以尝试使用.NET Memory Profiler(可免费试用)附加到正在运行的进程。与计数器相比,它具有相当的侵入性,但如果您需要捕获当前内存状态的快照以调试问题,则可能没有更好的选择。

答案 1 :(得分:1)

是的,您可以在应用程序运行时take a memory dump查看它在内存中的内容。这应该强化或否定你的假设。

答案 2 :(得分:1)

我最近发布了一个类似挑战的可能解决方案:

Profiling a multi-tiered, distributed, web application (server side)显示了一个高级方法(URL级别的分析):

  • 平台和语言无关
  • 完全非侵入性
  • 给出了应用程序大部分时间花在哪里的高级图片

我们的想法是使用现有的网络日志,并将它们转换为“一张图片,价值1000字”的图表。

这种方法对于需要更精细细节的用例来说是不够的,但它对我个人有所帮助,在您的案例中可能值得探索。

答案 3 :(得分:0)

你能在ASP .NET上做this吗?这是了解发生了什么的快速方法。