帮助中心

如何找出造成服务器CPU巨大的具体网站

分类 VPS服务器 阅读 2317 次 发布日期 2012-10-28

故障描述:

服务器非常慢,打开任务管理器,发现CPU占用率很高。在进程选项卡中按CPU排序,发现某个w3wp.exe进程占用CPU很大。请注意,进程中的每个w3wp.exe就对应着IIS中的每个应用程序池。

解决方案:

1、打开任务管理器,让PID(进程标识符)显示出来。点击查看->选择列,然后勾选上PID就可以显示出来了。下一步就是找到PID和进程池的对应关系,我们先判断出是哪个进程池出了问题,然后再分析进程池里面的网站。

2、在桌面上新建一个文本文档,内容如下:

'显示所有应用程序池编号 www.zhaomu.com 朝暮数据提供
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set ps = objWMIService.ExecQuery("select * from Win32_Process where Name='w3wp.exe'")
Str="AppPoolId  AppPoolName" & vbcrlf
For Each ps in ps
  Str = Str & "  " & ps.ProcessId & Space(10-len(ps.ProcessId)) & GetAppPoolId(ps.commandline) & vbcrlf
Next
WScript.Echo Str
Function GetAppPoolId(strArg)
  On Error Resume Next
  Dim Submatches,strPoolId,re,Matches
  Set re = New RegExp
  re.Pattern = "-ap ""(.+)"""
  re.IgnoreCase = True
  Set Matches = re.Execute(strArg)
  Set SubMatches = Matches(0).Submatches
  strPoolId = Submatches(0)
  GetAppPoolId = strPoolId
End Function

然后保存并重命名为getapp.vbs。注意必须是vbs文件后缀,双击执行就可以弹出一个PID和进程池名称的对应表。

3、这时我们就可以轻易看出哪个应用程序池出了问题了。接下来,为了让服务器尽快恢复正常,我们可以在任务管理器里面把这个有问题的进程给终止了,然后把对应的进程池也给停止了。

这里顺便说一下,我们在管理网站的时候,要尽可能的把网站分散到多个应用程序池中,一般每个进程池不超过15个为宜。这样做的好处就是网站可以分类管理,我们停止了某个进程池,只会影响到这个进程池下的网站,而不会影响到其他网站。如果把全部网站都放到一个进程池中,一旦这个进程池出问题,就会影响全部网站。

4、现在进程池是查出来了,那么到底是进程池中的哪个网站引起的呢?我们可以通过分析IIS的错误日志来发现罪魁祸首。其原理是,之所以w3wp.exe进程占用大量CPU,是因为有人在访问该网站中的某个页面,我们把应用程序池停止之后,别人的访问仍然是继续的,这样就会在IIS日志中留下访问报错记录。

停止进程池几分钟后,我们到C:\WINDOWS\system32\LogFiles\HTTPERR这个目录中,根据修改日期排序,打开最新生成的错误日志(比如上图中的2255.log)。假设我们禁用的进程池名称是AAA,那么搜索Disabled AAA,就可以查到关闭进程池后,有哪些网页被访问过了,而这些访问的网站就很可能是造成问题的元凶。

5、最近经常出现的DEDECMS漏洞,就是由黑客植入的PHP的文件造成的。黑客首先把病毒代码植入空间中,然后不停的访问他们,造成服务器对外发包,同时CPU也一路飙升。解决办法就是先清空整个网站,然后升级到最新版本的DEDECMS程序就好了。IIS的错误日志类似如下的情况:

80 HTTP/1.1 GET /plus/ddos.php?host=112.101.64.75&port=80&time=60 503 785 Disabled AAA

这条日志表明,是785号网站引起的。我们可以在IIS中,找到标识符为785号的网站,临时关闭或者联系客户进一步处理。