Windows11本地PowerShell脚本CPU/RAM日志数值异常问题咨询
解决Windows 11与Windows Server 2022上PowerShell CPU使用率统计差异问题
问题根源
Windows 11和Windows Server 2022在CPU性能计数器的采样、调度逻辑上存在差异:
- Win11的电源管理(如平衡模式)会动态调整核心功耗状态,导致
\Processor(_Total)\% Processor Time计数器的统计值偏离实际负载 - 部分脚本依赖核心数手动计算平均使用率,但不同系统对物理核心、超线程核心的计数逻辑不一致,进一步放大误差
修正后的脚本(跨系统一致)
使用CIM调用预格式化的性能数据类,避免手动计算带来的偏差:
# 获取CPU总使用率(跨Windows版本逻辑统一) $cpuTotal = Get-CimInstance Win32_PerfFormattedData_PerfOS_Processor -Filter "Name='_Total'" $cpuUsage = $cpuTotal.PercentProcessorTime # 获取RAM使用率 $osInfo = Get-CimInstance Win32_OperatingSystem $usedRam = $osInfo.TotalVisibleMemorySize - $osInfo.FreePhysicalMemory $ramUsage = [math]::Round(($usedRam / $osInfo.TotalVisibleMemorySize) * 100, 2) # 写入日志 $logContent = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - CPU使用率: $cpuUsage%, RAM使用率: $ramUsage%" Add-Content -Path ".\system_usage.log" -Value $logContent
额外排查步骤
- 电源模式验证:将Win11的电源模式切换为「高性能」,测试计数器数值是否与任务管理器一致
- 计数器直接校验:在PowerShell中直接执行
Get-Counter '\Processor(_Total)\% Processor Time',连续执行3-5次,观察数值波动是否符合实际负载 - 避免核心数依赖:不要用
(Get-CimInstance Win32_Processor).NumberOfLogicalProcessors这类值来计算平均使用率,不同系统的核心计数规则不同
内容的提问来源于stack exchange,提问作者WA94
相关产品推荐
相关产品推荐

