网站页面第一次速度很慢然后速度快的原因分析

最近使用ASP.NET写的一个页面,用户反映页面加载很慢,需要几十秒钟,需要分析优化一下。这是一个ASP.NET网站,从数据库里读取的商品数据,然后显示在前端页面中。简单描述一下查找问题的过程,以及其中学到的经验。

首先,要分析一下到底是哪里慢。一般第一反应都是SQL语句是不是慢,需不需要加索引优化一下。使用SQL Profiler监听的方式,找到了运行的SQL语句,拷贝出来,然后在SQL Server Management Studio中运行,发现2秒就执行完毕。所以排除了SQL慢的问题。

其次,既然SQL不慢,那可能是网站的某个方法慢了。接下来就是记录下来每个方法的具体执行时间,使用了StopWatch的方式,在Page_Load等方法开始执行的时候加一个StopWatch.Start, 然后结束的时候加一个StopWatch.Stop,然后算一下时间。通过观察日志,发现这些方法执行都很快,毫秒级别就执行完毕了。

那么就奇怪了,怎么页面加载会慢呢?然后又访问了一下页面,更奇怪了,页面不慢了。待了一会,又慢了。总结就是,第一次很慢,然后快了,然后多一段时间又慢了,又快了。

难道是跟IIS有关?这个网站部署在IIS中,application pool对应的worker process设置,是Idle空闲20分钟后就退出。所以考虑到这种空闲一会就变慢的现象,难道是因为空闲了一段时间后,w3wp.exe(worker process)对应的进程退出了,然后再次访问的时候,需要重新创建w3wp.exe进程,难道会变慢?接下来就是重启网站,然后把这个网站的application pool对应的w3wp.exe进程杀掉,然后再次访问。这次它确实有了重新创建w3wp.exe进程的过程,但是速度依然很快,毫秒级别就完成了,网页也很快就刷出来了。这不是这个网页偶尔很慢的原因。

后来想到是不是数据库缓存的原因。发现确实是这个原因。第一次我们执行SQL的时候,由于SQL比较耗费时间,所以很慢,需要30秒左右,导致第一次刷页面的时候很慢。但是SQL Server在第一次运行这段SQL之后,会缓存这个结果,第二次IIS服务器或者我们打开的SQL Server Management Studio再次向服务器运行同样的SQL的时候,SQL Server会从它自己的缓存中找到结果,然后返回给调用者,这次速度就很快。但是一段时间以后,SQL Server缓存的结果会过期,这就是为什么过一段时间又慢了。

注意,SQL Server不仅仅会对存储过程进行缓存,对通过网络传过来的SQL进行查询的结果,也会进行缓存。

既然找到了是SQL的运行速度慢,那么就需要优化一下。现在问题来了,我们怎么调这个SQL呢?我们第一次运行的时候,它会缓存,我们稍微改了改,它第二次运行的时候,如果大的结构没有变化,它依然能从缓存中找到结果,速度会非常快,给我们一种SQL运行很快的假象。为了能够真正查看SQL的运行速度,我们在运行SQL之前,可以执行以下命令,来清除对于SQL查询结果的缓存。

CHECKPOINT
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

这时候就能真正的拿到SQL查询运行的速度,进行优化。问题就解决了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值