我想在linux上分析我的c ++应用程序。 我想知道我的应用程序在CPU处理上花费了多少时间与IO /空闲时在块上花费的时间。
我知道在linux上有一个配置文件工具调用valgrind。但它打破了在每种方法上花费的时间,并没有让我全面了解CPU处理与闲置相比花费了多少时间?或者有没有办法用valgrind做到这一点。
答案 0 :(得分:6)
答案 1 :(得分:3)
我可以将valgrind
的{{3}}工具与callgrind一起推荐用于可视化。 KCacheGrind可以很容易地看到热点的位置。
注意:自从我使用它以来已经太久了,所以我不确定你是否能够获得I / O等待时间。也许与KCacheGrind或iostat一起,您将能够看到所有时间花在哪里。
答案 2 :(得分:3)
您可能需要查看Zoom,这比oprofile et al 更精致,功能更全面。这需要花钱(199美元),但你可以获得30天的免费评估许可证。
答案 3 :(得分:2)
LTTng是用于完整系统分析的好工具。
答案 4 :(得分:2)
如果你的应用程序只是运行“扁平化”(即它使用CPU或等待I / O),直到它退出,并且没有其他进程竞争,只需执行time myapp
(或者{{} { 1}},它对内置的shell产生略微不同的输出。)
这会得到类似的东西:
/usr/bin/time myapp
在这种情况下,用户+ sys(内核)时间占了几乎所有的实时时间,并且只有0.068秒未计入...(可能是最初加载应用程序及其支持库所花费的时间)。
但是,如果你要看到:
real 0m1.412s
user 0m1.288s
sys 0m0.056s
然后你的应用程序花了4.51s不消耗CPU并且可能在IO上被阻止。这是我认为您正在寻找的信息。
然而,这种简单的分析技术崩溃的地方是:
答案 5 :(得分:1)
编辑:
OProfile查看整个系统,因此过程将只是:
[设置oprofile]
opcontrol --init
opcontorl --vmlinux=/path/to/vmlinux (or --no-vmlinux)
opcontrol --start
[在这里运行您的应用]
opcontrol --stop (or opcontrol --shutdown [man for difference]
然后开始查看结果,看看opreport上的手册页
答案 6 :(得分:0)
valgrind中的lackey和/或helgrind工具应该允许你这样做。
答案 7 :(得分:0)
google-perf-tools - 更快的替代callgrind(它可以生成与callgrind格式相同的输出,因此您可以使用KCacheGrind)。
答案 8 :(得分:-1)
基本上,在程序启动和完成之间,它有一个调用堆栈。在I / O期间,堆栈在系统调用中终止。在计算过程中,它以典型指令终止。
无论哪种方式,如果您可以在随机的挂钟时间对堆栈进行采样,您可以确切地看到为什么花费这段时间。
唯一剩下的一点是 - 数以千计的样本可能会给人一种自信,但他们不会告诉你超过10或20个样本。