此问题涉及xperf和xperfview,这些实用程序是Windows性能工具包的一部分(反过来是Windows SDK 7.1的一部分)。
比较两个图表,“按线程进行CPU采样”和“按线程进行CPU使用”,我有几点不同之处。我将使用audiodg.exe作为示例。
在Threads下拉菜单中,CPU采样图表上只有一个用于audiodg的线程; CPU使用率图表显示了几个audiodg线程。
两个图都有一个标有“%Usage”的Y轴,但测量值不同。通常,CPU采样图表上给定线程的%使用率低于CPU使用率图表。
CPU采样摘要表显示每个模块/进程的权重和%权重。如果我加载符号,我可以深入研究audiodg过程。 “CPU计划聚合摘要”表(从“CPU使用情况”图启动)显示CPU使用率和%CPU使用率 - 权重不可用。 (相反,CPU采样摘要表中没有CPU使用率。)我无法深入了解audiodg - 我只看到主线程和一些ntdll.dll线程。
%CPU使用率和%权重列中任何进程的数字始终不同。有时他们的差异超过75%。
所以我的问题......这里CPU使用的可靠衡量标准是什么? CPU使用数是否来自CPU样本?这些数字不应该以某种方式相关吗?
答案 0 :(得分:4)
Xperf确实让这有点令人困惑,这是我对正在发生的事情的理解:
按线程进行CPU采样显示为每个线程记录的配置文件事件数,并在跟踪期间的某个时间间隔内进行聚合。例如,如果audiodg在10%的时间内执行了2秒钟,我们预计在此期间会看到大约10%的“使用率”。但是,因为这是基于抽样,所以在每个样本事件中,来自另一个进程的线程可能正在执行 - 换句话说,10%被样本事件'错过'。
线程的CPU使用率是使用上下文切换数据计算的。 “使用”是上下文切换然后稍后输出之间的时间量(当然,这些数据会在一小段时间内聚合)。
每个数据都有好处:
因此,为了回答您的问题,CPU使用率图表“更准确”,以了解每个线程执行的时间。但是,不排除使用采样数据,因为它可以更有助于了解线程实际花费时间的位置!对于CPU采样数据,摘要表更有价值,因为它将显示堆栈。对于CPU使用率数据,图表可能比汇总表更有用。
希望有所帮助!