PowerShell中Get-Counter获取进程CPU使用率数值异常咨询
PowerShell Get-Counter CPU使用率数值不符问题解析与解决方案
一、数值差异的原因
Get-Counter返回的\Process(*)\% Processor Time计数器,统计的是进程在所有逻辑处理器上占用的总CPU时间占比,数值范围是0到逻辑核心数×100。你有16个逻辑核心,所以该计数器的最大值为1600。
而任务管理器显示的单个进程CPU使用率,是该进程占用的CPU时间占系统总可用CPU资源的比例,也就是Get-Counter返回值 ÷ 逻辑核心数。你拿到的90除以16约为5.6%,和任务管理器的10%接近(采样时间点不同会导致数值波动),本质是两者的统计维度不同。
二、正确解读与转换方法
要将Get-Counter的数值转换为和任务管理器一致的结果,只需除以逻辑核心数:
# 获取系统逻辑核心数 $coreCount = (Get-WmiObject Win32_ComputerSystem).NumberOfLogicalProcessors # 目标进程名称,替换为你需要监控的进程名 $targetProcess = "yourProcessName" # 获取CPU计数器原始值 $cpuCounter = Get-Counter "\Process($targetProcess)\% Processor Time" $rawValue = $cpuCounter.CounterSamples.CookedValue # 转换为任务管理器风格的使用率 $convertedValue = $rawValue / $coreCount Write-Host "进程CPU使用率(任务管理器风格): $($convertedValue.ToString("F2"))%"
三、替代CPU使用率记录方案
如果觉得Get-Counter的逻辑过于繁琐,可使用以下两种更直观的方案:
1. 使用Get-Process计算实时使用率
Get-Process的CPU属性是进程累计占用的CPU秒数,通过两次采样的差值计算实时使用率:
$processName = "yourProcessName" $coreCount = (Get-WmiObject Win32_ComputerSystem).NumberOfLogicalProcessors # 第一次采样 $firstSample = Get-Process $processName Start-Sleep -Seconds 1 # 第二次采样 $secondSample = Get-Process $processName # 计算实时使用率 $cpuUsage = (($secondSample.CPU - $firstSample.CPU) / $coreCount / 1) * 100 Write-Host "实时CPU使用率: $($cpuUsage.ToString("F2"))%"
2. 使用CIM直接获取标准化数值
通过Win32_PerfFormattedData_PerfProc_Process类可以直接拿到和任务管理器逻辑一致的使用率:
$processName = "yourProcessName" # 注意:进程名如果有空格,需要用原始格式(比如"chrome#1"这类),可通过Get-CimInstance Win32_PerfFormattedData_PerfProc_Process查看 $processData = Get-CimInstance Win32_PerfFormattedData_PerfProc_Process -Filter "Name='$processName'" Write-Host "CPU使用率: $($processData.PercentProcessorTime)%"
内容的提问来源于stack exchange,提问作者Golden
相关产品推荐
相关产品推荐

