如何跟踪 ASP.Net JIT 编译?它很慢

Posted

技术标签:

【中文标题】如何跟踪 ASP.Net JIT 编译?它很慢【英文标题】:How can I trace ASP.Net JIT Compilation? Its very slow 【发布时间】:2011-07-21 16:33:11 【问题描述】:

如何跟踪应用程序的 JIT 编译?我们有一个小型 asp.net 应用程序,它是大型网站的一部分(其余代码为经典 asp),因此访问频率不高,并且(可能)在超时或应用程序池回收后重新编译。重新编译最多需要 2 分钟!

perfmon 中是否有跟踪工具或计数器可以帮助我跟踪到底发生了什么?

我打算尝试预编译,但我认为超时和应用程序池回收会使它变得毫无用处。 (或者这是一个糟糕的假设?)

提前谢谢!

【问题讨论】:

【参考方案1】:

如果您真的认为问题出在 Jit,您可以使用 .NET 性能计数器。打开“性能”管理控制台(因操作系统而异)并单击+,然后添加.NET CLR Jit 计数器:

这将允许您获得有关 Jit 的一些简单指标,在其中花费了多少时间等。

现在,我认为问题不完全在于“Jit”。可能是 ASP.NET 将您的应用程序编译为 Temporary ASP.NET Files,可能是强名称签名检查等。除了 CLR Jit 之外,我还会考虑许多其他事情。

Jit 特别是当 IL 代码被运行时编译为本机代码时,或者在 NGEN 中找到它。您的整个应用程序不会一次全部 JIT - 每个方法都是根据具体情况 JIT 的。

我认为最好的办法是查看 ASP.NET Applications 对象下的 Compilations Total 计数器,并尝试预编译您的网站。

【讨论】:

看来你是对的。 Jit 中的时间百分比最大值为 17,但直到我单击该特定应用程序的链接后近一分钟才超过 0。在 Jit 之前是否有任何计数器可以跟踪进程? 哦......第二个问题也是......有没有办法“重置”一切?我在两次测试之间等待了一个小时,因为一个简单的应用程序池回收不会产生 1.5 分钟的初始负载……就在我等待一段时间后再再次访问该链接时。谢谢! 肖恩,我正在研究第一季度。对于 Q2,尝试停止 IIS,并删除 C:\WINDOWS\Microsoft.NET\FrameworkXX\vZZZZZZ\Temporary ASP.NET Files 中的所有内容,如果您的工作进程是 64 位,则 XX 是空的或 64;其中 ZZZZZ 是 AppPool 的 .NET Framework 版本。例如,如果我的应用程序池是 32 位并且在 .NET Framework 4 上,则它将是 C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files。然后启动 IIS 备份。 Shawn,当您的应用程序正在加载时,您是否看到任务管理器中正在运行一个名为vbc.exe 的进程? (确保为所有用户显示进程)。 那台机器上的其他开发人员,所以我无法停止 IIS,但我确实停止了我的应用程序所在的应用程序池,并且能够删除那里的临时文件。谢谢你,谢谢你花时间帮助另一部分!

以上是关于如何跟踪 ASP.Net JIT 编译?它很慢的主要内容,如果未能解决你的问题,请参考以下文章

即时编译器(JIT) 速成课

在 ASP.NET 中发送大量电子邮件的最佳方式是啥?

Lambda初次使用很慢?从JIT到类加载再到实现原理

启用 ASP.NET 模拟时,异常堆栈跟踪中缺少行号

如何从像 Asp.Net 这样的堆栈跟踪中获取“源错误”?

真正解决ASP.NET每一个页面首次访问超级慢的问题 (转载)