无法在 Powershell 或 Python 中获取当前 CPU 频率
Unable to get current CPU frequency in Powershell or Python
我正在尝试以某种方式以编程方式记录我的 windows 10 机器的 CPU 频率。但是我显然无法获得任务管理器中显示的当前频率。
在 Powershell 中,使用
get-wmiobject Win32_Processor -Property CurrentClockSpeed
仅return时钟速度恰好是最大时钟速度(即使我可以在任务管理器中看到它没有运行那么高)
我什至试过这个解决方案:https://www.remkoweijnen.nl/blog/2014/07/18/get-actual-cpu-clock-speed-powershell/ 但除了静态值 = 最大值之外,它什么也没给我。
甚至 python 的 psutil 也只 return 一个静态值。
有谁知道如何解决这个问题并以某种方式记录每 x 秒的 CPU 频率?
任何帮助将不胜感激,谢谢!
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
关于为什么查询 WMI Win32_Processor
以获得 CurrentClockSpeed
似乎总是 return 最大频率而不是实际 "Current Clock Speed" 的更深入的解释?事实上,为什么所有的几十个WMI/CMI/Perfmon计数器似乎都return "wrong"频率?如果CPU-Z和任务管理器都可以获取到,那我们要获取"actual"频率怎么办呢?要回答这个问题,我们需要了解 CurrentClockSpeed
是什么 实际上 returning.
来自 Win32_Processor CurrentClockSpeed
的 WMI 文档:
Current speed of the processor, in MHz. This value comes from the
Current Speed member of the Processor Information structure in the
SMBIOS information.
太棒了!人们会认为这个简单的查询应该让我们得到当前的频率。这在十几年前很管用,但现在不行了;因为它真的只适用于两种非常具体的情况:
- 当您的处理器在其定义的库存速度下仅 运行s 时。
- 当 Windows 要求移动处理器以不同的速度 运行 时(例如,切换到电池模式)。
启动时,Widows 获取处理器信息并获取当前时钟速度。大多数人 运行 将他们的处理器设置为推荐设置,因此 Current Clock Speed == Max Clock Speed
,这意味着这两个数字始终匹配。当您更改电源状态时,Windows 会更改频率,CurrentClockSpeed
也会更改。
现在,十几年前发生了什么,基本上使 CurrentClockSpeed
完全 inaccurate/irrelevant?您最终可以感谢英特尔。由于一项名为 Turbo Boost.
的新技术,他们基本上将整个理想价值从水中吹了出来
Turbo Boost 与此有什么关系?
Turbo Boost 根据处理器上的当前负载在电压、电流和热包络范围内动态更改处理器频率。几乎所有现代处理器现在都具有省电模式,并且可以根据当前的营销流行语动态更改频率(例如 Turbo Boost(向上)、Cool'N'Quiet(向下))。
重点是:所有这些频率移动up/down/off/on都是自动完成的而Windows不知道.因为 Windows 不知道,所以 CurrentClockSpeed
值在大多数情况下可能完全不准确。事实上,微软知道这一点,当你打开你的性能监视器时,你会看到 Processor Performance/Processor Frequency
:
下的描述
Processor Frequency is the frequency of the current processor in
megahertz. Some processors are capable of regulating their frequency
outside of the control of Windows. Processor Frequency will not
accurately reflect actual processor frequency on these systems. Use
Processor Information\% Processor Performance instead.
幸运的是,这个描述给了我们一个提示,告诉我们必须使用什么来获得 实际 值: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% a.k.a。处理器频率的 153%(Turbo Boost 是的!)。然后我们从 CIM_Processor
class 中查询 MaxClockSpeed
(你也可以使用 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
}
我正在尝试以某种方式以编程方式记录我的 windows 10 机器的 CPU 频率。但是我显然无法获得任务管理器中显示的当前频率。
在 Powershell 中,使用
get-wmiobject Win32_Processor -Property CurrentClockSpeed
仅return时钟速度恰好是最大时钟速度(即使我可以在任务管理器中看到它没有运行那么高)
我什至试过这个解决方案:https://www.remkoweijnen.nl/blog/2014/07/18/get-actual-cpu-clock-speed-powershell/ 但除了静态值 = 最大值之外,它什么也没给我。
甚至 python 的 psutil 也只 return 一个静态值。
有谁知道如何解决这个问题并以某种方式记录每 x 秒的 CPU 频率?
任何帮助将不胜感激,谢谢!
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
关于为什么查询 WMI Win32_Processor
以获得 CurrentClockSpeed
似乎总是 return 最大频率而不是实际 "Current Clock Speed" 的更深入的解释?事实上,为什么所有的几十个WMI/CMI/Perfmon计数器似乎都return "wrong"频率?如果CPU-Z和任务管理器都可以获取到,那我们要获取"actual"频率怎么办呢?要回答这个问题,我们需要了解 CurrentClockSpeed
是什么 实际上 returning.
来自 Win32_Processor CurrentClockSpeed
的 WMI 文档:
Current speed of the processor, in MHz. This value comes from the Current Speed member of the Processor Information structure in the SMBIOS information.
太棒了!人们会认为这个简单的查询应该让我们得到当前的频率。这在十几年前很管用,但现在不行了;因为它真的只适用于两种非常具体的情况:
- 当您的处理器在其定义的库存速度下仅 运行s 时。
- 当 Windows 要求移动处理器以不同的速度 运行 时(例如,切换到电池模式)。
启动时,Widows 获取处理器信息并获取当前时钟速度。大多数人 运行 将他们的处理器设置为推荐设置,因此 Current Clock Speed == Max Clock Speed
,这意味着这两个数字始终匹配。当您更改电源状态时,Windows 会更改频率,CurrentClockSpeed
也会更改。
现在,十几年前发生了什么,基本上使 CurrentClockSpeed
完全 inaccurate/irrelevant?您最终可以感谢英特尔。由于一项名为 Turbo Boost.
Turbo Boost 与此有什么关系?
Turbo Boost 根据处理器上的当前负载在电压、电流和热包络范围内动态更改处理器频率。几乎所有现代处理器现在都具有省电模式,并且可以根据当前的营销流行语动态更改频率(例如 Turbo Boost(向上)、Cool'N'Quiet(向下))。
重点是:所有这些频率移动up/down/off/on都是自动完成的而Windows不知道.因为 Windows 不知道,所以 CurrentClockSpeed
值在大多数情况下可能完全不准确。事实上,微软知道这一点,当你打开你的性能监视器时,你会看到 Processor Performance/Processor Frequency
:
Processor Frequency is the frequency of the current processor in megahertz. Some processors are capable of regulating their frequency outside of the control of Windows. Processor Frequency will not accurately reflect actual processor frequency on these systems. Use Processor Information\% Processor Performance instead.
幸运的是,这个描述给了我们一个提示,告诉我们必须使用什么来获得 实际 值: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% a.k.a。处理器频率的 153%(Turbo Boost 是的!)。然后我们从 CIM_Processor
class 中查询 MaxClockSpeed
(你也可以使用 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
}