在过去的几天里,我学到了关于 WMI 和性能计数器的一切。
WMI 代表 Windows 管理规范。WMI 是向 WMI 系统和 Windows COM 子系统注册的类的集合。这些类称为提供者,并具有任意数量的公共属性,这些属性在查询时会返回动态数据。
Windows 预装了大量的 WMI 提供程序,为您提供有关 Windows 环境的信息。对于这个问题,我们关注的是Win32_PerfRawData* 提供程序和基于它构建的两个包装器。
如果您直接查询任何 Win32_PerfRawData* 提供程序,您会注意到它返回的数字看起来很吓人。那是因为这些提供者提供了原始数据,你可以用它来计算你想要的任何东西。
为了更轻松地使用 Win32_PerfRawData* 提供程序,Microsoft 提供了两个包装器,它们在查询时会返回更好的答案,即 PerfMon 和 Win32_PerfFormattedData* 提供程序。
好的,那么我们如何获得一个进程的 % CPU 利用率呢?我们有三个选择:
- 从 Win32_PerfFormattedData_PerfProc_Process 提供程序获取格式良好的数字
- 从 PerfMon 获取格式正确的数字
- 使用 Win32_PerfRawData_PerfProc_Process 为我们自己计算 % CPU 使用率
我们将看到选项 1 存在一个错误,因此它在所有情况下都不起作用,即使这是通常在互联网上给出的答案。
If you want to get this value from Win32_PerfFormattedData_PerfProc_Process you can use the query mentioned in the question. This will give you the sum of the PercentProcessorTime value for all of this process's threads. The problem is that this sum can be >100 if there is more than 1 core but this property maxes out at 100. So, as long as the sum of all this process's threads is less than 100 you can get your answer by dividing the process's PercentProcessorTime property by the core count of the machine.
If you want to get this value from PerfMon in PowerShell you can use Get-Counter "\Process(SqlServr)\% Processor Time"
. This will return a number between 0 - (CoreCount * 100).
如果您想自己计算此值,Win32_PerfRawData_PerfProc_Process 提供程序上的 PercentProcessorTime 属性将返回此进程已使用的 CPU 时间。因此,您需要拍摄两个快照,我们将它们称为 s1 和 s2。然后我们将执行 (s2.PercentProcessorTime - s1.PercentProcessorTime) / (s2.TimeStamp_Sys100NS - s1.TimeStamp_Sys100NS)。
这是最后的话。希望它可以帮助你。