无法在Powershell或Python中获得当前的CPU频率

时间:2020-05-14 16:25:18

标签: windows powershell cpu frequency

我试图以编程方式记录Windows 10计算机的CPU频率。但是,我显然无法获得任务管理器中显示的当前频率。

在Powershell中,使用

get-wmiobject Win32_Processor -Property CurrentClockSpeed

只会返回恰好是最大速度的时钟速度(即使我在任务管理器中可以看到它没有运行得那么快)

我什至尝试了以下解决方案:https://www.remkoweijnen.nl/blog/2014/07/18/get-actual-cpu-clock-speed-powershell/,但除了静态值=最大值之外,它什么也没有给我。

即使python的psutil也仅返回静态值。

有人知道如何解决这个问题,并实际上以某种方式每x秒记录一次CPU频率吗?

我们将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:2)

TLDR::要找到当前处理器频率,必须使用% Processor Performance性能计数器:

$MaxClockSpeed = (Get-CimInstance CIM_Processor).MaxClockSpeed
$ProcessorPerformance = (Get-Counter -Counter "\Processor Information(_Total)\% Processor Performance").CounterSamples.CookedValue
$CurrentClockSpeed = $MaxClockSpeed*($ProcessorPerformance/100)

Write-Host "Current Processor Speed: " -ForegroundColor Yellow -NoNewLine
Write-Host $CurrentClockSpeed

关于为什么为什么要查询Win32_Processor的WMI CurrentClockSpeed似乎总是返回最大频率而不是实际的“当前时钟速度”的更深入的解释?实际上,为什么所有数十个WMI / CMI / Perfmon计数器似乎都返回“错误”的频率?如果CPU-Z和任务管理器可以得到它,我们该怎么做才能获得“实际”频率?要回答这个问题,我们需要了解实际返回的CurrentClockSpeed是什么。

来自Win32_Processor CurrentClockSpeed的WMI文档:

处理器的当前速度,以MHz为单位。此值来自 处理器信息结构中的“当前速度”成员 SMBIOS信息。

太好了!有人会认为,这种简单的查询应该为我们提供当前的频率。这在十二年前就行之有效,但如今却不行。因为它实际上仅适用于两种非常特殊的情况:

  1. 如果您的处理器只能以其定义的库存速度运行。
  2. Windows要求移动处理器以不同的速度运行(例如,进入电池模式)。

在启动时,寡妇获得处理器信息并获得当前时钟速度。大多数人都在建议的设置Current Clock Speed == Max Clock Speed下运行处理器,这意味着两个数字始终匹配。更改电源状态时,Windows将更改频率,CurrentClockSpeed也将更改。

现在,十二年前发生了什么事情,实际上使CurrentClockSpeed完全不准确/不相关?您最终可以感谢英特尔。借助名为Turbo Boost的新技术,他们从本质上使整个理想价值浮出水面。

Turbo Boost与这有什么关系?

Turbo Boost在电压,电流和热包络范围内,根据处理器上的当前负载动态更改处理器频率。现在,几乎所有现代处理器都具有省电模式,并且可以根据当前的营销流行语(例如Turbo Boost(向上),Cool'N'Quiet(向下))动态更改其频率。

关键点是: 所有这些在上/下/下/上/下移动的频率都是自动完成的,而Windows对此一无所知 。由于Windows不了解,因此CurrentClockSpeed值在大多数情况下可能是完全不准确的。实际上,Microsoft知道这一点,当您打开性能监视器时,您会看到Processor Performance/Processor Frequency下的描述:

处理器频率是当前处理器的频率,以 兆赫。一些处理器能够调节其频率 Windows无法控制的范围。 处理器频率不会 准确反映这些系统上的实际处理器频率。 处理器信息\处理器性能%。

幸运的是,该描述为我们提供了获取实际值所需要使用的提示:Processor Information\% Processor Performance

我们可以使用Get-Counter来访问当前的处理器性能,如下所示:

PS C:\> Get-Counter -Counter "\Processor Information(_Total)\% Processor Performance"

Timestamp                 CounterSamples
---------                 --------------
2020-01-01 1:23:45 AM     \\HAL9256\processor information(_total)\% processor performance :
                          153.697654229441

在这里,您可以看到我的处理器正在以153%的频率运行,也就是处理器频率的153%(是Turbo Boost!)。然后,我们从MaxClockSpeed类中查询CIM_Processor(也可以使用WMI_Processor):

PS C:\> (Get-CimInstance CIM_Processor).MaxClockSpeed
2592

为了计算出实际时钟速度:

$MaxClockSpeed = (Get-CimInstance CIM_Processor).MaxClockSpeed
$ProcessorPerformance = (Get-Counter -Counter "\Processor Information(_Total)\% Processor Performance").CounterSamples.CookedValue
$CurrentClockSpeed = $MaxClockSpeed*($ProcessorPerformance/100)

Write-Host "Current Processor Speed: " -ForegroundColor Yellow -NoNewLine
Write-Host $CurrentClockSpeed

如果需要每2秒运行一次(Ctrl+C停止),则将其包装成循环:

$MaxClockSpeed = (Get-CimInstance CIM_Processor).MaxClockSpeed

While($true){
    $ProcessorPerformance = (Get-Counter -Counter "\Processor Information(_Total)\% Processor Performance").CounterSamples.CookedValue
    $CurrentClockSpeed = $MaxClockSpeed*($ProcessorPerformance/100)

    Write-Host "Current Processor Speed: " -ForegroundColor Yellow -NoNewLine
    Write-Host $CurrentClockSpeed

    Sleep -Seconds 2
}