问题描述:
第一次打开网站首页时特别慢,打开之后无论点哪个页面都很快。长时间无人访问,又会变慢。
原因分析:(环境Win7 64位 IIS7.5)
我们第一次向IIS7请求ASP.NET网页时,IIS会启动w3wp.exe进程,同时在C:\Windows\Microsoft.NET\Framework\v4.0.30319\TemporaryASP.NET Files (也可在IIS中自定义该目录)建立一个文件夹,并将网站相关的DLL等资源复制到该目录下(该步骤会占用一部分时间,我们成为PTime-1),然后JIT来运行这些DLL文件(该步骤也会占用一部分时间,我们成为PTime-2),最后将运行结果发送给客户端。
第一次打开aspx页面变慢主要的时间是(PTime-1 + PTime-2),其它的时间可以忽略不计。
如果网站内容不更新(专指DLL更新,aspx、ascx等没有影响),网站重起(开机重启、超时回收重启、任务管理器中关闭w3wp.exe进程、执行IISRESET等),只有PTime-2,没有PTime-1。一旦内容不更新,下次再请求这个网页时又会重新创建一个临时目录,花费的时间是(PTime-1+ PTime-2)。
IIS 在这期间做了哪些工作呢?当向服务器发送一个ASP.NET网页的请求时,在内部执行的流程如下:
1、检查在服务器内存中是否存在这个网页对应的本地机器代码。
2、如果存在,则执行本地机器代码,将运行结果发送到客户端。
3、如果不存在本地机器代码,则检查是否存在这个网页编译后的中间代码(以DLL的形式存在),如果存在,则将中间代码编译成本地机器代码,再执行本地机器代码将结果返回给客户端,并将本地机器代码缓存到内存中。
如果服务器没有清理掉内存中缓存的本地机器代码而再次访问同一个页面时,服务器就会直接执行缓存中的本地机器代码,本地机器代码的运行速度是相当快的。即使本地机器代码在内存中由于某些原因被清理掉了(比如服务器重启或者服务器内存不够用时被释放),也仅仅是将中间代码编译成本地机器代码,再次运行本地机器代码将运行结果发送给客户端,然后缓存本地机器代码即可,将中间代码编译成本地机器代码的速度也是很快的。
如果站点中有HTM 等静态网页,则不需要PTime-1、PTime-2两个过程,执行速度都是很快的。
如何解决首次加载慢的问题,目前没有好的办法,以下方案可供参考:
1、延长IIS 回收时间
2、做一个浏览器模拟程序,定时访问网页
注意:临时文件保存目录与应用程序池的设置有关,通常选择64位,要比选择32位慢。
对于解决方案第二步可考虑,计划任务结合批处理解决
path=%path%; C:\Program Files\InternetExplorer\iexplore.exe
start iexplore http://www.baidu.com
start iexplore http://www.baidu.com
start iexplore http://www.baidu.com
@ping -n 20 127.0.0.1
taskkill /f /im iexplore.exe