VPS中如何檢視具體是哪個網站造成伺服器CPU上升?

Tags: 網站, 伺服器,

需要解決的問題

如何檢視具體是哪個網站造成伺服器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(回車後根據提示操作)

相關問題答案