大型网站优化与故障诊断实战 (下)

2、经过数据库的优化后,发现IIS的进程占用的cup非常的高,甚至瞬间上升到80%~90

 

A、这种情况估计是代码中存在死循环。天哪,网站上有几百甚至上千的文件,如何查找,晕死。

首先,分析一下死循环产生的情况,利用VBScriptASP的时候,利用循环语句时,可能发生死循环。举例子,最能说明问题:

 

 strSQL=”Select name from user where name=’张三’”

 Set RS=Server.CreateObject("ADODB.RecordSet")

RS.CursorLocation=3

RS.Open strSQL,objConn,0,1  ’objConn是已经创建好的对象

 

i=0

 DO While i<=5 and Not RS.EOF

i=i+1

一些操作

RS.MoveNext

Loop

 

如果RS.MoveNext忘写了,肯定是死了。但这种情况很少发生,要发生这样的错误,将是不可饶恕。

如果SQL语句有错误,由于某种原因条件变为name=”张三,或者name=张三;本人调试的时候,发现上述的语句是死循环。很纳闷,i<=5应该可以结束循环,但并没有。有兴趣的话,可以试试,至少本人测试是死循环。

 

 

 

 

 

解决方案:

a.       改造循环语句,使其更健壮。测试结果显示,可以结束循环

i=0

 DO While Not RS.EOF

i=i+1

一些操作

RS.MoveNext

if i>5 then

              exit do

end if

Loop

 

b. 对于RecordSet对象,如果打开没有记录的 Recordset 对象,BOF EOF 属性将设置为 True,而 Recordset 对象的 RecordCount属性设置为零。打开至少包含一条记录的 Recordset 对象时,第一条记录为当前记录,而 BOF EOF 属性为 False。但是,我在使用中发现,如果有一条记录时,上面的说法并不准确。本人发现有的程序员在判断用户是否存在时,利用了NOT RS.EOF ,这样有可能根据错误的逻辑,造成死循环,建议最好使用RecordCount

其次,如果上述的方法由于代码太多,行不通。这里有一个很具有针对性的方案。

     

思路:使用服务器上的MS SQL工具“事件探查器”和“任务管理器”。新建一个跟踪,当CUP达到100%时,请马上“暂停所选择的跟踪”或“停止所选择的跟踪”,然后把所有执行的SQL命令抠出来,粘贴到“查询分析器”中查看是否存在语法错误。


操作图示:
sql_tcq3.JPG

根据存在语法错误的SQL语句,定位可能出问题文件。

通过上述的数据库优化和对文件中SQL语句的逐一排查,如果还不能解决您的问题。请继续往下看。

 

3、打开服务器上“管理工具”中的“性能”

 

操作图示:


xn_1.JPG

跟踪查看每个性能对象的参数:

xn_2.JPG

请关注套红部分的参数,如果由于访问量的过大,造成CUP负载过大的话,赶快升级服务器的硬件去吧!

【写后感】

本文仅仅是在原有的框架设计基础上进行的优化,一个易用,健壮,安全,并且性能良好的网站,仅上面谈到的还远远不够。请大家把好的框架设计,存储结构及宝贵的经验拿来分享。

【声明】

 此文仅是本人的一点经验,不当之处请大家指点。望大家共同参与大型网站优化的讨论。

原文地址:https://www.cnblogs.com/kokoliu/p/678503.html