虚拟主机服务器的CPU100%的解决办法

做虚拟主机的服务器很容易出现CPU100%,尤其是做一些便宜的虚拟主机的,做企业网站的服务器不大出现这种情况。出现这种情况的原因大部分是因为客户的程序不太好,是用ASP+Access做的程序,程序死循环了就容易出现CPU100%,还有遭CC攻击的时候,也容易出现100%。

那么如何排查出有问题的网站呢?我们采用的是进程池二分法。

首先,需要保证服务器使用的是IIS6.0的,因为只有6.0以上版本才引入了进程池这个概念,进程池能够把为数众多的虚拟主机分割管理,当一个进程池死掉时,不影响其他进程池里面的网站的访问。一个进程池在任务管理器里面就显示一个w3wp.exe,因此查找出CPU占用最高的w3wp.exe就查找出了这个有问题的网站所在的进程池了。

那么,如何查找对应进程池呢?先打开任务管理器,打开任务管理器的方法是,在底部状态栏点右键,选择“任务管理器”,打开“进程”选项卡。再点击上面菜单的“查看”,点击“选择列”,选中PID和CPU,这两个一定要选中。

再打开开始菜单的运行,输入cmd,进入DOS界面,输入:iisapp -a,要耐心等待一段时间,因为这时候服务器CPU100%,不管运行什么程序都很慢,有时候要3-4分钟才能显示出运行结果,这个运行结果就是进程池名和对应的w3wp.exe的PID名称。

还有一个更快的办法,在桌面上新建一个vbs文件,文件名任意,内容是:

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
保存后,双击运行,就能看到每个进程池的编号,以及对应的PID值。 确定了占用CPU大的进程池后,立即把这个进程池关掉,稍等片刻,或者在任务管理器中终止这个进程池,服务器的CPU就会马上下来了。那么关闭的这个进程池里面的其他网站怎么办呢,总不能一直关掉吧。这里要求我们做虚拟主机的,平时一个进程池里面不能放太多网站,我们推荐是20个以内,收费更高的虚拟主机公司,还可以放更少些。 我们把一些不大可能的虚拟主机转移到一个新建的进程池里面,根据我的经验,纯静态网站,公司简介类网站不大可能导致CPU100%,而购物网站,门户网站,新闻网站很容易导致的。采用这种二分法,分出一部分空间出来。再把进程池打开,再观察一段时间,若又出现CPU100%了,再用刚才的方法来查看哪个进程池造成的,如此循环,再结合我刚才的经验,相信不久就能找到有问题的网站了。
返回行业资讯