w3wp.exe进程CPU占用高的解决办法

近期学院首页服务器经常出现w3wp.exe进程访问量占到99%的 现象,百度后了解原因为代码中存在死循环,前几天一直没有想到方法查找哪个文件出了问题,今天参加同学聚会,喝了点小酒,突然想到一个方法:将学院主页及 各教学系部的网站都尽量跑在独立的空间(资源池),让其之间不会相互影响。但是这样得有一个前提条件,就是IIS访问“虚拟目录”的优先级必须大于实际目 录的优先级。
举例来说,假设根目录/下有一个实际的文件夹Kaisir,以及一个虚拟目录Kaisir,那我们从浏览器中访问/Kaisir,是访问的虚拟目录还是实际目录呢?经试验,是优先访问的虚拟目录。这样就为我接下来的测试奠定了基础。
接下来,我建立了一系列的资源池,首 先将网站“主站部分”与“系科设置”部分分开,放入两个不同的资源池,等到一会CPU占用飙高,通过一个命令“iisapp -a”可以显示出每个“资源池”与“w3wp.exe”进程的对应关系,通过对应关系,可以判断是主站的代码出了问题,还是下面各教学系的代码出现问题。

通过iisapp -a 查看对应关系,发现是“系科设置”这个目录下的文件造成了w3wp.exe占用99%的问题(这里我舒了一口气……嘿嘿 我看来我修正惠新的代码质量还是挺高的 :) 嘿嘿 )接下来,我就按照教学系建立资源池与虚拟目录,再次通过iisapp -a查看对应关系,终于发现了是“gmx”这个夹子内的代码出现问题,尝试访问,发现一直都打不开,而且服务器w3wp.exe占用率再次飙升到 100%。暂时取消掉这个虚拟目录的asp执行权限,并强制结束这个w3wp.exe进程(这是利用虚拟目录与资源池的一大好处:可以随意的结束掉死掉的 进程而不用担心会影响其他站点的访问。当然最后我会总结)

既然找到出现问题的夹子,我尝试进行修正,发现其实并不存在死循环, 而是没有调用打开数据库的函数,而一般我们没有打开数据库IIS会报错并显示出错信息,而这次什么都没有,并造成了w3wp.exe进程几乎占用100% 的CPU,这是什么原因?罪魁祸首在这个文件中出现了下面两行代码:



这是很危险的举动,尤其是第一条,将超时时间定义为100000(单位:秒)这样会让IIS一直等待这个程序完成,可是因为出错,所以完不成,故w3wp.exe一直占用为100%
总结:
1)对于IIS来说同名目录来说,虚拟目录的访问优先级高于真实存在的目录的优先级。
2)网上检索说w3wp.exe进程占用100%是因为死循环造成,现在看来这样说不完全对,如果超时时间设置的特别长,并且程序出错了,也会出现这样的情况。
3)网站如果有一定的规模,最好设置多个虚拟目录,并设置对应的资源池,这样一旦某个目录中的文件出现问题,不会影响到全站。(资源池设置可以设置CPU及内存使用限制,可以在超限之后自动回收资源或者Down掉应用,以免拖累死整个服务器)