在 IIS 服務器上,特別是運行虛擬主機環境時,很多管理員都會遇到 CPU 占用 100% 或系統資源異常的情況,但往往不知道是哪個網站導致了問題。以下方法可以幫助我們快速定位每個站點的資源使用情況(主要是內存和 CPU 占用)。
步驟一:將每個網站設置為獨立進程
1.打開 IIS 管理器
選擇具體的站點,右鍵點擊 “屬性”。
切換到 “主目錄” 選項卡,將 “應用程序保護” 改為 “高(獨立)”。
這樣會為每個站點啟動一個獨立的 dllhost.exe 進程。
2.查看獨立進程的資源占用
打開 任務理器,切換到 “進程” 選項卡。
你會看到多個 dllhost.exe 進程,每個進程對應一個獨立的站點。
此時可以看到這些進程的 CPU 占用 和 內存使用量。
步驟二:找到每個站點對應的進程(dllhost.exe)
接下來,我們需要確認每個 dllhost.exe 進程對應的是哪個網站。
1.打開組件服務管理器
在 運行 中輸入 dcomcnfg,按回車打開 組件服務。
依次展開:組件服務 → 計算機 → 我的電腦 → COM+ 應用程序。
2.查看站點與進程的關聯
在 COM+ 應用程序 下,你會看到類似于 IIS-{domain.com//Root} 這樣的條目。
每個條目代表一個 IIS 網站,名稱中包含對應的域名或站點路徑。
點擊頂部工具欄中的 “狀態查看”,你會看到如下信息:
名稱 運行狀態 PID
IIS-{example.com//Root} 是 1688
PID 就是對應的 dllhost.exe 進程 ID,可以在任務管理器中找到。
3.確認資源占用
打開任務管理器 → “詳細信息” 選項卡。
找到對應的 dllhost.exe,對比進程 ID(PID),即可查看該網站的 CPU 占用 和 內存使用量。
這樣就能快速定位是哪個網站導致了資源占用異常。
步驟三:通過 PowerShell 腳本快速定位
如果服務器站點較多,手動排查效率低,可以通過 PowerShell 腳本實現快速定位。
# 加載 IIS 模塊
Import-Module WebAdministration
# 獲取所有運行的 w3wp.exe 進程和對應的資源占用
$Processes = Get-Process w3wp –ErrorAction SilentlyContinue
$AppPools = Get-WebAppPoolState | Where-Object { $_.Value -eq “Started” }
# 遍歷應用程序池,輸出內存和 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)”
}
}
腳本功能:
列出每個 IIS 應用程序池的進程 ID、內存使用量和 CPU 使用率。
適用于需要快速定位資源占用高的站點。
步驟四:結合 Perfmon 進行深入分析
1.打開 性能監視器(Perfmon):
在 運行 中輸入 perfmon.msc 并回車。
2.添加 w3wp 或 dllhost 進程的監控:
在左側面板中,選擇 “性能監視器”,然后點擊 “添加計數器”。
添加 Process → Working Set(內存占用) 和 % Processor Time(CPU 占用)。
選中對應的進程,查看資源占用情況。