如何对正在运行的ASP.NET应用程序进行非侵入性分析?
情况:ASP.NET live网站有时太忙 向代码中添加完整的评测将对性能产生太大的影响。使用性能监视器,我们很快在“所有堆中的字节数”计数器中找到了锯齿形图,它与GC计数器配对。我们认为某些代码是罪魁祸首。 对于某些页面、lib、函数或任何东西,是否有临时“注入”评测的方法或可能性?最好是尽可能轻,因为任何额外的开销都可能导致这个脆弱的系统崩溃。我知道.NET不支持方法回调挂钩(这在AOP中很常见)。是的,您可以在应用程序运行时查看它在内存中保存的内容。这会强化或否定你的假设。一些想法:如何对正在运行的ASP.NET应用程序进行非侵入性分析?,.net,asp.net,profiling,monitoring,.net,Asp.net,Profiling,Monitoring,情况:ASP.NET live网站有时太忙 向代码中添加完整的评测将对性能产生太大的影响。使用性能监视器,我们很快在“所有堆中的字节数”计数器中找到了锯齿形图,它与GC计数器配对。我们认为某些代码是罪魁祸首。 对于某些页面、lib、函数或任何东西,是否有临时“注入”评测的方法或可能性?最好是尽可能轻,因为任何额外的开销都可能导致这个脆弱的系统崩溃。我知道.NET不支持方法回调挂钩(这在AOP中很常见)。是的,您可以在应用程序运行时查看它在内存中保存的内容。这会强化或否定你的假设。一些想法: 使用
编辑:您还可以尝试使用.NET内存探查器(免费试用)附加到正在运行的进程。与计数器相比,它具有相当大的侵入性,但如果您需要捕获内存当前状态的快照以调试问题,可能没有更好的选择。您可以在ASP.NET上执行吗?这是一个快速了解情况的好方法。我最近发布了一个类似挑战的可能解决方案: 显示了一种高级方法(在URL级别进行分析),即:
- 平台和语言无关
- 完全非侵入性
- 提供应用程序大部分时间在何处花费的高级图片
这种方法对于需要更精细细节的用例来说是不够的,但它对我个人有帮助,在您的案例中可能值得探索。深入研究它,似乎确实是一条应该走的道路。这篇文章缺少了最有趣的事情:进行内存转储。如何?…刚刚进行了内存转储,但它重置了应用程序池,停止了一段时间的请求服务(在转储期间,但花费的时间太长),实际转储为200MB,而进程的转储为800MB。。。隐马尔可夫模型。。。有没有更不避讳的东西?谢谢你的建议。我知道所有这些,事实上,我们认为可能原因的代码片段没有在一次性物品周围使用
块。但我的直觉告诉我,这里还有其他东西(用户数是原来的10倍,代码相同,运行很长时间都很平稳)。事件日志中没有奇数,没有奇数个失败请求。性能计数器是我们的全职计数器(请参阅原始问题)。根据您的问题,我以为您只是在使用现有的Windows性能计数器,而不是添加您自己的自定义计数器。。。。线程/锁定问题是性能问题的另一个常见原因。是的,也许我的问题不是很清楚(对不起,尽量简短,这不是我最好的优点)。但我应该用它们做更多的工作(自定义性能计数器),但现在不能重建,只能监视(这是这个商店的重要时期)。线程和锁,或者其他类型的等待循环当然应该在我们的监视器上,谢谢。对不起,我想说的是,线程/锁问题加上IDisPoables的不当处理可能解释了为什么您的代码以前工作正常,现在不再正常了。自定义指令插入通常是发现类似问题的最小侵入性(有时是唯一的)方法(除了进行一些详细的代码演练)。另一种可能是使用.NET内存探查器(请参阅)--我也用这些信息更新了我的答案。不是真的。不过,您可以附加windbg之类的调试器,基本上可以获得大部分相同的信息——不过这是一个非常具有侵入性的解决方案,特别是在生产环境中。@RickNZ:这是一种侵入性的解决方案。有些人制作的小玩意会吸引正在运行的进程并拍摄堆叠照片。我看看能不能找到链接。