sdk - Xperfview : What's the difference between CPU sampling and CPU Usage?

标签 sdk performance xperf

此问题与 xperf 和 xperfview 有关,它们是 Windows Performance Toolkit(Windows SDK 7.1 的一部分)的一部分的实用程序。

比较两个图表“按线程的 CPU 采样”和“按线程的 CPU 使用率”,有几个我不明白的差异。我将使用 audiodg.exe 作为示例。

  1. 在线程下拉列表中,CPU 采样图表上只有一个用于 audiodg 的线程; CPU 使用率图表显示了几个 audiodg 线程。

  2. 两个图表的 Y 轴都标记为“使用百分比”,但测量结果不同。通常,CPU 采样图表上给定线程的使用百分比低于 CPU 使用图表上的百分比。

  3. CPU 采样汇总表显示每个模块/进程的权重和权重百分比。如果我加载符号,我可以深入挖掘 audiodg 过程。 CPU 调度聚合摘要表(从 CPU 使用率图表启动)显示 CPU 使用率和 CPU 使用率百分比 - 权重不可用。 (相反,CPU 使用率在 CPU 采样汇总表中不可用。)我无法深入研究 audiodg - 我只看到主线程和一些 ntdll.dll 线程。

  4. “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/

相关文章:

performance - 在另一台计算机上查看 xperf ETL 文件时出错

windows - 在 Xperf 中捕获调用堆栈和事件

.net - Lync SDK - 为 Lync 制作插件

java - 如何在 kubernetes 环境中使用 spark 配置 beam python sdk

Python 日志记录与性能

r - 如何将数据快速加载到R中?

performance - 为什么这些例程在 Mathematica 中的相对效率高?

objective-c - 如何使用 Theos/Logos 中的 %group 功能?

java - Android Studio 逻辑错误

windows性能记录器记录具体过程