Sdk Xperfview:What';CPU采样和CPU使用之间的区别是什么?

Sdk Xperfview:What';CPU采样和CPU使用之间的区别是什么?,sdk,performance,xperf,Sdk,Performance,Xperf,这个问题与xperf和XPerView有关,它们是Windows性能工具包的一部分(反过来又是Windows SDK 7.1的一部分) 比较两个图表,“按线程进行CPU采样”和“按线程进行CPU使用”,我不理解其中的几个差异。我将以audiodg.exe为例 在Threads下拉列表中,CPU采样图上audiodg只有一个线程;CPU使用率图表显示了几个audiodg线程 两个图形都有一个Y轴标记为“%Usage”,但测量值不同。通常,CPU采样图表上给定线程的使用率百分比低于CPU使用率图表上

这个问题与xperf和XPerView有关,它们是Windows性能工具包的一部分(反过来又是Windows SDK 7.1的一部分)

比较两个图表,“按线程进行CPU采样”和“按线程进行CPU使用”,我不理解其中的几个差异。我将以audiodg.exe为例

  • 在Threads下拉列表中,CPU采样图上audiodg只有一个线程;CPU使用率图表显示了几个audiodg线程

  • 两个图形都有一个Y轴标记为“%Usage”,但测量值不同。通常,CPU采样图表上给定线程的使用率百分比低于CPU使用率图表上的百分比

  • CPU采样汇总表显示每个模块/进程的权重和百分比权重。如果我加载符号,我就可以深入了解audiodg过程。CPU调度汇总汇总表(从CPU使用率图表启动)显示CPU使用率和%CPU使用率--权重不可用。(相反,CPU使用情况在CPU采样汇总表中不可用。)我无法深入研究audiodg——我只看到主线程和几个ntdll.dll线程

  • %CPU使用率和%Weight列中任何进程的数字总是不同的。有时它们的差异超过75%


  • 所以我的问题。。。这里CPU使用的可靠度量是什么?CPU使用率不是从CPU样本中得出的吗?这些数字不应该有某种关联吗?

    Xperf确实让人有点困惑,这是我对发生的事情的理解:

    • CPU样本数据,通过配置文件内核标志启用。CPU样本数据以一定的时间间隔收集,并记录有关CPU当时在做什么的信息(例如,采样时的进程、线程Id和调用堆栈)
    • 上下文切换数据,使用CSWITCH内核标志启用。这将记录发生的每个上下文切换的数据(例如,谁被切换入/切换出以及调用堆栈)
    按线程进行的CPU采样显示为每个线程记录的配置文件事件的数量,这些事件在跟踪期间的某个时间间隔内聚合。例如,如果audiodg在2秒钟内执行了10%的时间,我们希望在这段时间内看到大约10%的使用率。但是,因为这是基于采样的,所以在每个样本事件中,可能都有来自另一个进程的线程正在执行——换句话说,样本事件“遗漏”了10%

    线程的CPU使用率是使用上下文开关数据计算的。“使用率”是指从上下文切换到稍后退出的时间量(当然,这些数据是在一个小的时间间隔内聚合的)

    每种数据都有好处:

    • CPU采样实际上会告诉您线程在采样时正在做什么,因为它在线程执行期间收集调用堆栈。上下文切换信息只会告诉您线程何时被切换入或切换出,而不会在线程之间进行切换
    • 上下文切换信息将告诉您每个线程执行的确切时间。这个数据是正确的。当然,抽样只是概率性的
    因此,为了回答您的问题,CPU使用率图表对于理解每个线程执行的时间“更准确”。但是,不要排除使用采样数据的可能性,因为它有助于理解线程实际花费时间的位置!对于CPU采样数据,汇总表更有价值,因为它将显示堆栈。对于CPU使用率数据,图表可能比汇总表更有帮助


    希望有帮助

    回答得好!扎实透彻。我还有一个附带的问题:xperf默认使用1kHz采样,我了解到它不是通过暂停/恢复线程进行采样,那么它如何在采样点准确捕获当前调用堆栈?不是通过系统API调用点,对吗?因为对系统API的调用不能保证均匀分布。