在 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 占用)。
选中对应的进程,查看资源占用情况。