我试图以编程方式记录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频率吗?
我们将不胜感激,谢谢!
答案 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信息。
太好了!有人会认为,这种简单的查询应该为我们提供当前的频率。这在十二年前就行之有效,但如今却不行。因为它实际上仅适用于两种非常特殊的情况:
在启动时,寡妇获得处理器信息并获得当前时钟速度。大多数人都在建议的设置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
}