Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 用于基准测试CPU的WMI与psutil_Python 3.x_Windows_Wmi_Psutil - Fatal编程技术网

Python 3.x 用于基准测试CPU的WMI与psutil

Python 3.x 用于基准测试CPU的WMI与psutil,python-3.x,windows,wmi,psutil,Python 3.x,Windows,Wmi,Psutil,我使用三种方法获取windows计算机的CPU使用率: 间隔为1秒的psutil: cpu使用率=psutil.cpu百分比间隔=1 间隔为10秒的psutil: cpu使用率=psutil.cpu百分比间隔=10 WMI包: c=wmi.wmi query=从Win32_performatteddata_PerfOS_处理器中选择*,其中name=''u Total' cpu_使用率=c.queryquery[0]。PercentUserTime ` 测量值之间的差异约为30%; 我想知道每种

我使用三种方法获取windows计算机的CPU使用率:

间隔为1秒的psutil:

cpu使用率=psutil.cpu百分比间隔=1

间隔为10秒的psutil:

cpu使用率=psutil.cpu百分比间隔=10

WMI包:

c=wmi.wmi query=从Win32_performatteddata_PerfOS_处理器中选择*,其中name=''u Total' cpu_使用率=c.queryquery[0]。PercentUserTime

`

测量值之间的差异约为30%;
我想知道每种方法的优缺点,以及哪种方法最准确。

了解CPU测量可变性的基础是了解构成测量基础的Windows时钟滴答声和在任何给定滴答声中被测量为活动或空闲的逻辑CPU,以及您描述的方法执行计算的方式

默认的Windows时钟频率为每秒64次,或每次15.625毫秒。如果要查看WMI表Win32_PerfRawData_PerfOS_处理器中递增的刻度计数器,上面引用的表在其计算中绘制的原始数据将以156250 100纳秒刻度的倍数递增。大量的纳秒给人一种错误的精度感,而实际上,每个处理器在每个测量间隔的开始和结束时都可以关闭一个刻度,最多为1/64秒

所以你认为一秒钟的时间可能短到62/64秒,或者长到66/64秒,误差+/-3.125%。没什么大不了的,但人们可能更喜欢10秒的间隔,范围为+/-0.3125%

然而,对于分子来说,这种精度的缺乏是一个更大的问题,因为你没有足够的时间来处理。对于每个逻辑处理器,标记在用户、系统和空闲之间进行划分。例如,考虑使用25% CPU、分12.5%系统、12.5%用户和75%空闲的超线程的四核系统。您有八个逻辑处理器。在每个处理器处于活动状态的1/4秒内,仅经过16个时钟周期,系统模式下8个周期,用户模式下8个周期。但是,如果选择了错误的开始和结束时间,则可能低于或超过2个时钟节拍,8个逻辑处理器中的每一个都有6到10个节拍。因此,如果你为整个系统加上刻度,你会得到48到80个刻度,而预期的是64个,潜在误差高达+/-25%。在相同的情况下,两个独立的测量值之间的偏差可能高达50%。要添加用户+系统以获得总体CPU使用率吗?连续测量的差异高达100%。当然,这些都是最坏的极端情况,实际误差会更小,如果你在很长一段时间后对所有误差进行平均,它们将最终为零

现在,关于你提问的方法:

1和2:psutil.cpu\u引擎盖下的呼叫百分比。与WMI方法相比,这有一个优势,即在求和结果时不会出现额外的错误。但是,请注意,您得到的是自计算机启动以来这些值的累计总时间。一个使用率在10%到30%之间的系统,每次都会给你一个20%左右的计算,几乎没有变化。为了在更短的时间范围内测量CPU使用情况,您需要保存上一次调用的结果,然后测量经过时间的差异。您还应该将经过的节拍相加,用作经过的时间,以避免进一步的不准确。在这种情况下,较长的计算间隔将减少错误,尽管您当然可以进行滚动计算,例如,每1秒轮询一次,但使用10秒的历史值

3:WMI _Total实例只是对单个逻辑处理器的值求和,因此,与1和2中基于系统的方法相比,处理器越多,精度越差。此外,格式化数据基于类似命名表中的原始数据,经过的时间基于采样间隔。这意味着第一个示例将提供与第一个方法中的累计自开始使用量类似的结果,但如果间隔太短,则稍后的示例将提供未更改的数据,或者提供自上次示例以来的当前使用量。除了这种使用格式化数据进行计算的相对缺乏控制的情况外,手动计算原始数据可以克服这种情况。WMI还有一个缺点,即查询性能计数器的COM开销有时在第一次查询时非常缓慢,而psutil方法是直接的本机系统调用,重复使用速度更快

总之:对于总系统时间,最好使用psutil值,但根据您选择的轮询间隔内连续测量值之间的差异进行自己的计算。间隔越长,m越精确 测量,但测量使用峰值的能力较低

WMI使您能够更深入地了解每个处理器的使用情况,但需要权衡开销,以便于查询。如果您确实希望使用此功能,您可能希望直接从系统性能计数器中获取此功能,而WMI最终将从系统性能计数器中获取这些功能