powershell 监控 windows 性能计数器核心是 get-counter 命令,支持本地/远程采集 cpu、内存、磁盘、网络等关键指标,可单次采样、持续刷新、导出 csv 或批量监控多服务器。
powershell 监控 windows 关键性能计数器,核心是用 get-counter 直接读取系统内置的 perfmon 计数器——轻量、实时、无需安装额外工具,且支持本地和远程采集。
直接读取常用计数器路径
Windows 性能计数器路径有标准命名规则,关键指标对应如下(英文名,中文系统需用 Get-Counter -ListSet 确认本地化名称):
- CPU 总体使用率:
\Processor(_Total)\% Processor Time - 可用物理内存(MB):
\Memory\Available MBytes - 内存提交占比:
\Memory\% Committed Bytes In Use - 磁盘平均读延迟(秒):
\LogicalDisk(C:)\Avg. Disk sec/Read - 磁盘平均写延迟(秒):
\LogicalDisk(C:)\Avg. Disk sec/Write - 磁盘每秒读字节数:
\PhysicalDisk(0 C:)\Disk Read Bytes/sec - 网卡接收速率(替换
Ethernet为实际名称):\Network Interface\Ethernet\Bytes Received/sec - TCP 每秒重传段数:
\TCPv4\Segments Retransmitted/sec
✅ 提示:用
Get-NetAdapter查网卡名;用Get-Counter -ListSet PhysicalDisk | Select-Object CounterSetName, Paths查磁盘实例;首次运行建议以管理员身份启动 PowerShell。
单次采样与快速验证
适合排查瞬时问题或脚本初始化检查:
# 一次性获取多个指标
Get-Counter '\Processor(_Total)\% Processor Time', '\Memory\Available MBytes', '\LogicalDisk(C:)\Avg. Disk sec/Read' |
ForEach-Object { $_.CounterSamples | Select-Object Path, CookedValue }
输出示例:
Path CookedValue ---- ----------- \Processor(_Total)\% Processor Time 12.45 \Memory\Available MBytes 6248.3 \LogicalDisk(C:)\Avg. Disk sec/Read 0.012
持续监控与动态刷新
类比 PerfMon 实时图表,适合运维值守或快速观察:
# 每 3 秒刷新一次,共 20 次,带时间戳
Get-Counter -Counter '\Processor(_Total)\% Processor Time', '\Memory\Available MBytes' `
-SampleInterval 3 -MaxSamples 20 |
ForEach-Object {
$_.CounterSamples | Select-Object Timestamp, Path, @{Name='Value';Expression={$_.CookedValue}}
} | Format-Table -AutoSize
如需无限滚动显示(类似 watch),可用循环加 Clear-Host:
while ($true) {
Clear-Host
$cpu = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue
$mem = (Get-Counter '\Memory\Available MBytes').CounterSamples.CookedValue
Write-Host "CPU: $($cpu.ToString('F1'))% | Mem Free: ${mem} MB" -ForegroundColor Cyan
Start-Sleep -Seconds 2
}
导出数据用于分析与基线建立
采集结果可转为结构化对象,导出 CSV 供 Excel 或脚本后续处理:
# 采集 1 分钟数据(每 5 秒一次),保存为 CSV $data = Get-Counter -Counter '\Processor(_Total)\% Processor Time', '\Memory\Available MBytes' ` -SampleInterval 5 -MaxSamples 12 $data.CounterSamples | Select-Object Timestamp, Path, CookedValue | Export-Csv "perf_$(Get-Date -Format 'yyyyMMdd_HHmm').csv" -NoTypeInformation
之后可用 Import-Csv 计算统计值,例如:
$csv = Import-Csv "perf_20260614_2300.csv"
$cpuVals = $csv | Where-Object { $_.Path -like "*% Processor Time*" } | ForEach-Object { [double]$_.CookedValue }
$cpuVals | Measure-Object -Average -Maximum -Minimum -Percentile 95
远程监控多台服务器
只需加 -ComputerName 参数,支持数组批量操作(目标机器需开启 WinRM 或防火墙允许性能计数器远程访问):
$servers = 'SRV01', 'SRV02', 'DB01'
Get-Counter -Counter '\Processor(_Total)\% Processor Time' -ComputerName $servers -MaxSamples 1 |
ForEach-Object {
[PSCustomObject]@{
Server = $_.Timestamp.ToString('yyyy-MM-dd HH:mm') + " @ " + $_.Timestamp.MachineName
CPU = $_.CounterSamples.CookedValue
}
}
不复杂但容易忽略










