歡迎來(lái)到藍(lán)隊(duì)云技術(shù)小課堂,每天分享一個(gè)技術(shù)小知識(shí)。
在 IIS 服務(wù)器上,特別是運(yùn)行虛擬主機(jī)環(huán)境時(shí),很多管理員都會(huì)遇到 CPU 占用 100% 或系統(tǒng)資源異常的情況,但往往不知道是哪個(gè)網(wǎng)站導(dǎo)致了問(wèn)題。以下方法可以幫助我們快速定位每個(gè)站點(diǎn)的資源使用情況(主要是內(nèi)存和 CPU 占用)。
步驟一:將每個(gè)網(wǎng)站設(shè)置為獨(dú)立進(jìn)程
1.打開(kāi) IIS 管理器
選擇具體的站點(diǎn),右鍵點(diǎn)擊 “屬性”。
切換到 “主目錄” 選項(xiàng)卡,將 “應(yīng)用程序保護(hù)” 改為 “高(獨(dú)立)”。
這樣會(huì)為每個(gè)站點(diǎn)啟動(dòng)一個(gè)獨(dú)立的 dllhost.exe 進(jìn)程。
2.查看獨(dú)立進(jìn)程的資源占用
打開(kāi) 任務(wù)理器,切換到 “進(jìn)程” 選項(xiàng)卡。
你會(huì)看到多個(gè) dllhost.exe 進(jìn)程,每個(gè)進(jìn)程對(duì)應(yīng)一個(gè)獨(dú)立的站點(diǎn)。
此時(shí)可以看到這些進(jìn)程的 CPU 占用 和 內(nèi)存使用量。
步驟二:找到每個(gè)站點(diǎn)對(duì)應(yīng)的進(jìn)程(dllhost.exe)
接下來(lái),我們需要確認(rèn)每個(gè) dllhost.exe 進(jìn)程對(duì)應(yīng)的是哪個(gè)網(wǎng)站。
1.打開(kāi)組件服務(wù)管理器
在 運(yùn)行 中輸入 dcomcnfg,按回車打開(kāi) 組件服務(wù)。
依次展開(kāi):組件服務(wù) → 計(jì)算機(jī) → 我的電腦 → COM+ 應(yīng)用程序。
2.查看站點(diǎn)與進(jìn)程的關(guān)聯(lián)
在 COM+ 應(yīng)用程序 下,你會(huì)看到類似于 IIS-{domain.com//Root} 這樣的條目。
每個(gè)條目代表一個(gè) IIS 網(wǎng)站,名稱中包含對(duì)應(yīng)的域名或站點(diǎn)路徑。
點(diǎn)擊頂部工具欄中的 “狀態(tài)查看”,你會(huì)看到如下信息:
名稱 運(yùn)行狀態(tài) PID
IIS-{example.com//Root} 是 1688
PID 就是對(duì)應(yīng)的 dllhost.exe 進(jìn)程 ID,可以在任務(wù)管理器中找到。
3.確認(rèn)資源占用
打開(kāi)任務(wù)管理器 → “詳細(xì)信息” 選項(xiàng)卡。
找到對(duì)應(yīng)的 dllhost.exe,對(duì)比進(jìn)程 ID(PID),即可查看該網(wǎng)站的 CPU 占用 和 內(nèi)存使用量。
這樣就能快速定位是哪個(gè)網(wǎng)站導(dǎo)致了資源占用異常。
步驟三:通過(guò) PowerShell 腳本快速定位
如果服務(wù)器站點(diǎn)較多,手動(dòng)排查效率低,可以通過(guò) PowerShell 腳本實(shí)現(xiàn)快速定位。
# 加載 IIS 模塊
Import-Module WebAdministration
# 獲取所有運(yùn)行的 w3wp.exe 進(jìn)程和對(duì)應(yīng)的資源占用
$Processes = Get-Process w3wp -ErrorAction SilentlyContinue
$AppPools = Get-WebAppPoolState | Where-Object { $_.Value -eq "Started" }
# 遍歷應(yīng)用程序池,輸出內(nèi)存和 CPU 占用
foreach ($AppPool in $AppPools) {
$AppPoolName = $AppPool.ItemXPath.Split("/")[-1]
$PID = (Get-WmiObject Win32_Process | Where-Object { $_.Name -eq "w3wp.exe" -and $_.CommandLine -match $AppPoolName }).ProcessId
if ($PID) {
$Process = $Processes | Where-Object { $_.Id -eq $PID }
Write-Output "App Pool: $AppPoolName | PID: $PID | Memory: $($Process.WorkingSet / 1MB) MB | CPU: $($Process.CPU)"
}
}
腳本功能:
列出每個(gè) IIS 應(yīng)用程序池的進(jìn)程 ID、內(nèi)存使用量和 CPU 使用率。
適用于需要快速定位資源占用高的站點(diǎn)。
步驟四:結(jié)合 Perfmon 進(jìn)行深入分析
1.打開(kāi) 性能監(jiān)視器(Perfmon):
在 運(yùn)行 中輸入 perfmon.msc 并回車。
2.添加 w3wp 或 dllhost 進(jìn)程的監(jiān)控:
在左側(cè)面板中,選擇 “性能監(jiān)視器”,然后點(diǎn)擊 “添加計(jì)數(shù)器”。
添加 Process → Working Set(內(nèi)存占用) 和 % Processor Time(CPU 占用)。
選中對(duì)應(yīng)的進(jìn)程,查看資源占用情況。
藍(lán)隊(duì)云官網(wǎng)上擁有完善的技術(shù)支持庫(kù)可供參考,大家可自行查閱,更多技術(shù)問(wèn)題,可以直接咨詢。同時(shí),藍(lán)隊(duì)云整理了運(yùn)維必備的工具包免費(fèi)分享給大家使用,需要的朋友可以直接咨詢。
更多技術(shù)知識(shí),藍(lán)隊(duì)云期待與你一起探索。