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

如何对正在运行的ASP.NET应用程序进行非侵入性分析?,.net,asp.net,profiling,monitoring,.net,Asp.net,Profiling,Monitoring,情况:ASP.NET live网站有时太忙 向代码中添加完整的评测将对性能产生太大的影响。使用性能监视器,我们很快在“所有堆中的字节数”计数器中找到了锯齿形图,它与GC计数器配对。我们认为某些代码是罪魁祸首。 对于某些页面、lib、函数或任何东西,是否有临时“注入”评测的方法或可能性?最好是尽可能轻,因为任何额外的开销都可能导致这个脆弱的系统崩溃。我知道.NET不支持方法回调挂钩(这在AOP中很常见)。是的,您可以在应用程序运行时查看它在内存中保存的内容。这会强化或否定你的假设。一些想法: 使用

情况:ASP.NET live网站有时太忙

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

对于某些页面、lib、函数或任何东西,是否有临时“注入”评测的方法或可能性?最好是尽可能轻,因为任何额外的开销都可能导致这个脆弱的系统崩溃。我知道.NET不支持方法回调挂钩(这在AOP中很常见)。

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

一些想法:

  • 使用自定义Windows性能计数器。它们非常轻量级(1%到2%),您不仅可以使用它们进行计数,还可以使用它们进行计时测量,查看某些操作比阈值慢多少次,等等
  • 如果您使用的是IIS 7,则可以启用失败的请求跟踪。要限制性能影响,请小心不要启用太多页面。这些跟踪可以提供很多细节,如果需要,您可以通过编程方式向它们注入更多信息
  • 在异常情况下,使用Windows事件日志写入自定义详细信息。性能影响是最小的,只要你不做得太多
  • 锯齿状内存行为的一个原因可能是不在应该调用Dispose()时调用Dispose()(或者在using语句中包装IDisposable对象,这将为您调用);您可能需要检查代码以查找该问题
  • 如果有帮助,您可能还会对我的书中的性能提示感兴趣:


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

    您可以在ASP.NET上执行吗?这是一个快速了解情况的好方法。

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

    显示了一种高级方法(在URL级别进行分析),即:

    • 平台和语言无关
    • 完全非侵入性
    • 提供应用程序大部分时间在何处花费的高级图片
    其想法是使用现有的网络日志,并将其转换为“一张图片抵得上1000个单词”的图表


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

    深入研究它,似乎确实是一条应该走的道路。这篇文章缺少了最有趣的事情:进行内存转储。如何?…刚刚进行了内存转储,但它重置了应用程序池,停止了一段时间的请求服务(在转储期间,但花费的时间太长),实际转储为200MB,而进程的转储为800MB。。。隐马尔可夫模型。。。有没有更不避讳的东西?谢谢你的建议。我知道所有这些,事实上,我们认为可能原因的代码片段没有在一次性物品周围使用
    块。但我的直觉告诉我,这里还有其他东西(用户数是原来的10倍,代码相同,运行很长时间都很平稳)。事件日志中没有奇数,没有奇数个失败请求。性能计数器是我们的全职计数器(请参阅原始问题)。根据您的问题,我以为您只是在使用现有的Windows性能计数器,而不是添加您自己的自定义计数器。。。。线程/锁定问题是性能问题的另一个常见原因。是的,也许我的问题不是很清楚(对不起,尽量简短,这不是我最好的优点)。但我应该用它们做更多的工作(自定义性能计数器),但现在不能重建,只能监视(这是这个商店的重要时期)。线程和锁,或者其他类型的等待循环当然应该在我们的监视器上,谢谢。对不起,我想说的是,线程/锁问题加上IDisPoables的不当处理可能解释了为什么您的代码以前工作正常,现在不再正常了。自定义指令插入通常是发现类似问题的最小侵入性(有时是唯一的)方法(除了进行一些详细的代码演练)。另一种可能是使用.NET内存探查器(请参阅)--我也用这些信息更新了我的答案。不是真的。不过,您可以附加windbg之类的调试器,基本上可以获得大部分相同的信息——不过这是一个非常具有侵入性的解决方案,特别是在生产环境中。@RickNZ:这是一种侵入性的解决方案。有些人制作的小玩意会吸引正在运行的进程并拍摄堆叠照片。我看看能不能找到链接。