首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何定位空闲时间(网络IO时间等)在XPerf?

如何定位空闲时间(网络IO时间等)在XPerf?
EN

Stack Overflow用户
提问于 2010-11-13 19:10:26
回答 3查看 866关注 0票数 3

假设我有一个精心设计的程序:

代码语言:javascript
复制
#include <Windows.h>

void useless_function()
{
    Sleep(5000);
}

void useful_function()
{
    // ... do some work
    useless_function();
    // ... do some more work
}

int main()
{
    useful_function();
    return 0;
}

目标:我希望分析器告诉我,useful_function()没有必要地打电话给useless_function(),这并不是什么明显的原因。在XPerf下,这不会出现在我所拥有的任何图表中,因为对WaitForMultipleObjects()的调用似乎被记为Idle.exe而不是我自己的程序。

下面是我当前运行的xperf命令行:

代码语言:javascript
复制
xperf -on Latency -stackwalk Profile

有什么想法吗?

(这不限于等待函数。上述问题可以通过在NtWaitForMultipleObjects__放置断点来解决。理想情况下,可以找到一种方法来查看堆栈示例,它占用了大量的挂钟时间,而不仅仅是CPU时间)。

EN

回答 3

Stack Overflow用户

发布于 2012-06-15 00:04:05

我认为您正在寻找的是在Xperf中具有就绪线程功能的等待分析。它捕获每个上下文开关,并在线程从睡眠(或其他阻塞的操作)中醒来后,为您提供调用堆栈。在您的示例中,您将看到调用睡眠(5000)之后的堆栈以及花在睡眠中的时间。

这个功能使用起来有点模糊。但幸运的是,这里描述得很好:

使用Xperf的等待分析进行应用程序性能故障排除

票数 2
EN

Stack Overflow用户

发布于 2015-02-22 05:45:25

等待分析就是这样做的。您应该:

  • 记录CSWITCH提供程序,以便获得所有上下文开关
  • 通过将+CSWITCH添加到-stackwalk参数中,在上下文开关上记录调用堆栈
  • 可能会在就绪线程上记录调用堆栈,以便通过向-stackwalk中添加+READYTHREAD获得更多信息,说明谁为您准备就绪(即,谁发布了Mutex或CS或信号量以及在哪里)。

然后,在WPA (或xperfview,但这是很古老的)中使用CPU使用率(精确)来查看上下文开关,并在不应该空闲的线程上找到TimeSinceLast高的位置。您通常希望按这种顺序使用CPU中的列(精确):

  • NewProcess (您的进程正在切换)
  • NewThreadId
  • NewThreadStack
  • ReadyingProcess (使您的线程准备好运行)
  • ReadyingThreadId (可选)
  • ReadyThreadStack (可选,需要+-stackwalk上的线程)
  • 橙条
  • 计数
  • TimeSinceLast (us) -按此列排序,通常
  • 任何你想要的列

有关详细信息,请参阅我博客中的以下特定文章:- https://randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/ - https://randomascii.wordpress.com/2012/06/19/wpaxperf-trace-analysis-reimagined/

票数 1
EN

Stack Overflow用户

发布于 2010-11-13 20:36:50

这个“分析器”会告诉你-只是随机暂停它几次,看看堆栈。如果do some work需要5秒,do some more work需要5秒,那么堆栈的33%的时间将如下所示

代码语言:javascript
复制
main: calling useful_function
useful_function: calling useless_function
useless_function: calling Sleep

因此,大约33%的堆栈样本将准确地显示这一点。任何一行代码,如果花费的是时钟时间的一小部分,就会出现在样本的大致上。

在其余的示例中,您将看到它正在做其他事情。

有些自动分析器以更漂亮的方式做同样的事情,比如缩放LTProf,尽管它们实际上并没有向您展示示例。

我查看了xperf文档,试图找出是否可以在挂钟时间获得堆栈样本,并获得行级分辨率的百分比。看来你一定是在Windows 7或Vista上。它们只关心函数,而不是行,如果您有实际的大函数,这是很重要的。我不知道如何访问单个样本,我认为这对于了解程序为什么要花费时间是很重要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4174204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档