需要解決的問題
如何檢視具體是哪個網站造成伺服器CPU上升,CPU100%
問題的簡單描述
我們在“伺服器訪問緩慢的處理辦法”這篇技術文章中分析了造成伺服器很慢的幾種原因,其中一個很常見的原因就是伺服器的CPU100%。那麼對於伺服器上執行著幾十個甚至幾百個的網站而言,怎樣查到具體是哪個網站造成的呢?
解決方法
首先,我們開啟工作管理員,按照程序名稱排序,發現其中有很多w3wp.exe這樣的程序名稱,其實這每個w3wp.exe就對應著每個程序池。我們可以很快發現哪個程序池佔用了最大的CPU,也可以找到其對應的PID編號(PID編號在“檢視->選擇列”裡面勾選上就可以顯示出來了)。
那麼下一個關鍵問題就是如何建立w3wp.exe和IIS中程序池的對應關係呢?我們在桌面上新建一個文字文件,內容如下:
'顯示所有應用程式池當前PID及應用程式池名
Set objWMIService = GetObject("winmgmts:\.
ootcimv2")
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和程序池名稱的對應表.
這樣我們就可以斷定具體哪個程序池造成伺服器CPU巨大了。下面問題接著出來了,由於每個程序池中放的網站都不止一個,那麼怎麼知道是具體哪個網站造成的呢?在這裡,朝暮資料要提醒您,我們在分配程序池中的網站時,一定要對每個程序池中的網站個數做出規定。比如規定一個程序池放15個網站,部分重點客戶放到獨立程序池中,也就是一個程序池中只放一個網站。這樣一旦出現問題,也就最多影響15個網站,也方便在這些網站中查出罪魁禍首。如果把全部網站都放到一個程序池中,那就頭痛了,查問題的時候非常不方便,一旦這個程序池出問題,影響的網站數量也非常多。
下面,我們還是儘快把這個有問題的程序池給停止了,然後在工作管理員中結束對應的程序,這時伺服器的CPU就馬上降下來了。
停止幾分鐘後,我們到C:WINDOWSsystem32LogFilesHTTPERR這個目錄中,找到最新生成的錯誤日誌,開啟分析。比如我們禁用的程序池名稱是AAA,那麼搜尋Disabled AAA,就可以查到關閉程序池後,有哪些網頁被訪問過了,而這些訪問的網頁其中某個就是造成問題的元凶。比如下面這行,很明顯就是一個ddos.php的檔案造成的。其根本原因是客戶沒有把程序升級到最新版本,而被黑客植入了這個程式碼,造成伺服器對外發包,同時CPU巨大。最好是清空整個網站,然後升級到最新版本的程式。
簡單方法
在CMD視窗中輸入: iisapp -a(回車後根據提示操作)