此问题与 xperf 和 xperfview 有关,它们是 Windows Performance Toolkit(Windows SDK 7.1 的一部分)的一部分的实用程序。
比较两个图表“按线程的 CPU 采样”和“按线程的 CPU 使用率”,有几个我不明白的差异。我将使用 audiodg.exe 作为示例。
在线程下拉列表中,CPU 采样图表上只有一个用于 audiodg 的线程; CPU 使用率图表显示了几个 audiodg 线程。
两个图表的 Y 轴都标记为“使用百分比”,但测量结果不同。通常,CPU 采样图表上给定线程的使用百分比低于 CPU 使用图表上的百分比。
CPU 采样汇总表显示每个模块/进程的权重和权重百分比。如果我加载符号,我可以深入挖掘 audiodg 过程。 CPU 调度聚合摘要表(从 CPU 使用率图表启动)显示 CPU 使用率和 CPU 使用率百分比 - 权重不可用。 (相反,CPU 使用率在 CPU 采样汇总表中不可用。)我无法深入研究 audiodg - 我只看到主线程和一些 ntdll.dll 线程。
“CPU 使用率百分比”和“权重百分比”列中任何进程的数字始终不同。有时它们的差异超过 75%。
所以我的问题...这里 CPU 使用率的可靠衡量标准是什么? CPU 使用率数字不是来自 CPU 样本吗?这些数字不应该有某种关联吗?
最佳答案
Xperf 确实让这有点令人困惑,这是我对正在发生的事情的理解:
- CPU 样本数据,通过 PROFILE 内核标志启用。 CPU 样本数据会定期收集,并记录有关 CPU 当时正在执行的操作的信息(例如样本时的进程、线程 ID 和调用堆栈)。
- 上下文切换数据,通过 CSWITCH 内核标志启用。这记录了有关发生的每次上下文切换的数据(例如,谁被切换入/出以及调用堆栈。)
按线程进行 CPU 采样显示为每个线程记录的配置文件事件数,这些事件在跟踪持续时间的某个时间间隔内聚合。例如,如果 audiodg 在 2 秒内执行 10% 的时间,我们预计在这段时间内会看到大约 10“% 使用率”。然而,因为这是基于采样的,所以在每个样本事件中,来自另一个进程的线程可能恰好正在执行——换句话说,样本事件“错过”了 10%。
线程的 CPU 使用率是使用上下文切换数据计算的。 “使用情况”是上下文切换进入和稍后切换之间的时间量(当然,这些数据是在某个小间隔内聚合的)。
每种数据都有好处:
- CPU 采样实际上会告诉您在采样时线程正在做什么,因为它会在执行期间收集调用堆栈线程。上下文切换信息只会告诉您线程何时切换入或切换出,但不会告诉您切换之间的情况。
- 上下文切换信息将准确告诉您每个线程执行的时间。此数据是正确的。当然,抽样只是概率性的。
因此,为了回答您的问题,CPU 使用率图表对于了解每个线程的执行时间“更准确”。但是,不要排除使用采样数据,因为它对于了解线程实际将时间花在哪里更有帮助!对于CPU采样数据,汇总表更有值(value),因为它会显示堆栈。对于 CPU 使用率数据,图表可能比汇总表更有帮助。
希望有帮助!
关于sdk - Xperfview : What's the difference between CPU sampling and CPU Usage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3567093/