前一段时间,自己这站点就遇到了 IIS+PHP 环境下 w3wp.exe 进程 CPU 占用过高的问题,造成 IIS 无法正常的工作,从而让网站时好时坏。上周研究了三天后,找到了最终原因,目前工作了十天,没有任何问题,看来原因找到,故以下按照 WIN2003 详细分析给大家做为参考。

出现这种问题时,首先要判定是哪个网站造成了 w3wp.exe 进程占用过高。这点,网上流传的方法还是比较可行的。不过,想判定这个必须要一个先决的条件:就是你的各个 WEB 网站必须使用独立的应用程序池。

判定方法:
1 在任务管理器中增加显示 pid 字段。就可以看到占用内存或者 cpu 最高的进程 pid !
2 在命令提示符下运行 iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到 pid 对应的应用程序池。
3 到 iis 中察看该应用程序池对应的网站就可以了!然后真对站点排除错误!(如果运行后出现 error - no no results 这样的提示,说明你的站点没有开启或还没有被访问过!)

解决方法:
1 尝试删除系统路径\System32\Logfiles\W3SVC1 下当天的错误日志文件,如:ex060904.log,然后重新启动IIS,等待一段时间,看看有没有问题。
注:有时非法重启或者写入日志错误都有可能造成 w3wp.exe 进程锁死。

2 设置应用程序池的CPU监视,不超过25%,每分钟刷新,超过限制时自动关闭。
注:此方法只能用来做为测试,在真正的环境下,这个可能会引起网站时好时坏。不推荐长期使用。

3 检查你的程序代码,或者网页调用,程序没写好或者有死循环,是最容易造成 w3wp.exe 锁死的。
注:方法是先停止IIS,再删除当天的网站日志(系统路径\System32\Logfiles\对应的网站目录下),然后开启IIS,等待CPU高占用的出现,这时在1分钟内打开新建的日志文件,按出现时间,对应检查里面所罗列出现的文件,检查代码是否有问题。

4 检查数据库完整性和 ODBC 的有效性。
注:有些写得不好的 ASP 程序,在访问数据库无法做到容错性,所以有些时候数据库损坏或者 ODBC 传送数据不正常,都有可能造成多次强制查询,从而体现为 w3wp.exe 高 CPU 占用。

5 检查文件的权限。
注:不要奇怪,某些时候真的出现这种事情,一个文件无法写入或者无法读取,都会引起很大的问题。

----------------------------

以上才是真正的解决手段和方法,网上流传的资料,不是很让人满意。

就我自己网站来说吧,原因在于 LinPHA 这个相册系统,不知道为什么,这个系统,在收到非标准的搜索 search 代码时,就会出现变量无法赋值的问题。
在调试的时候,我就发现了,Google Bot 在搜索时,能准确的识别出我的语言代码页,搜索所赋值的变量数值合法,所以不出问题。
而遇到 Baidu 蜘蛛时却就有意外发生了,因为 Baidu 本身不认 Unicode 代码,所以他会将你的代码页当成 GBK 来搜索,自然在 Unicode 的搜索页里就出现赋值不是合法数值的问题,然后导致运算出错,最后把w3wp.exe 锁死,等90秒或者更长时间,系统强制回收变量时,才能自动恢复。

这就是前段时间,本站访问不正常的根本原因。

最近更换了新相册程序,所以目前为止,没有发现任何问题。

 

 

说明:此文章为转载文章

posted on 2010-07-29 16:23  ⌒緈だ旭☆⌒  阅读(613)  评论(0编辑  收藏  举报