如何检查具体是哪个网站造成服务器CPU巨大

我们在“服务器访问缓慢的处理办法”这篇技术文章中分析了造成服务器很慢的几种原因,其中一个很常见的原因就是服务器的CPU100%。那么对于服务器上运行着几十个甚至几百个的网站而言,怎样查到具体是哪个网站造成的呢?
1、首先,我们打开任务管理器,按照进程名称排序,发现其中有很多w3wp.exe这样的进程名称,其实这每个w3wp.exe就对应着每个进程池。我们可以很快发现哪个进程池占用了最大的CPU,也可以找到其对应的PID编号(PID编号在“查看->选择列”里面勾选上就可以显示出来了)。那么下一个关键问题就是如何建立w3wp.exe和IIS中进程池的对应关系呢?

2、我们在桌面上新建一个文本文档,内容如下:
'显示所有应用程序池当前PID及应用程序池名
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、这样我们就可以断定具体哪个进程池造成服务器CPU巨大了。下面问题接着出来了,由于每个进程池中放的网站都不止一个,那么怎么知道是具体哪个网站造成的呢?在这里,朝暮数据要提醒您,我们在分配进程池中的网站时,一定要对每个进程池中的网站个数做出规定。比如规定一个进程池放15个网站,部分重点客户放到独立进程池中,也就是一个进程池中只放一个网站。这样一旦出现问题,也就最多影响15个网站,也方便在这些网站中查出罪魁祸首。如果把全部网站都放到一个进程池中,那就头痛了,查问题的时候非常不方便,一旦这个进程池出问题,影响的网站数量也非常多。
下面,我们还是尽快把这个有问题的进程池给停止了,然后在任务管理器中结束对应的进程,这时服务器的CPU就马上降下来了。
4、停止几分钟后,我们到C:\WINDOWS\system32\LogFiles\HTTPERR这个目录中,找到最新生成的错误日志,打开分析。比如我们禁用的进程池名称是AAA,那么搜索Disabled AAA,就可以查到关闭进程池后,有哪些网页被访问过了,而这些访问的网页其中某个就是造成问题的元凶。比如下面这行,很明显就是一个ddos.php的文件造成的。其根本原因是客户没有把程序升级到最新版本,而被黑客植入了这个代码,造成服务器对外发包,同时CPU巨大。最好是清空整个网站,然后升级到最新版本的程序。
80 HTTP/1.1 GET /plus/ddos.php?host=112.101.64.75&port=80&time=60 503 785 Disabled AAA
原文地址:https://www.cnblogs.com/bluecobra/p/2684358.html