我想在linux上剖析我的c ++应用程序。 我想知道我的应用程序花费在CPU处理上的时间与IO处于空闲状态的时间花费了多less时间。
我知道有一个configuration文件工具在Linux上调用valgrind。 但是它打破了在每种方法上花费的时间,并没有给我一个关于在CPU处理和空闲上花费多less时间的整体情况? 或者有没有办法用valgrind做到这一点。
我可以推荐valgrind
的callgrind工具与KCacheGrind结合进行可视化。 KCacheGrind使得查看热点位置变得非常容易。
注意:使用它已经太久了,所以我不确定你是否能够获得I / O等待时间。 也许与iostat或pidstat结合,你将能够看到所有的时间花在哪里。
检查oprofile 。 对于更多的系统级诊断,请尝试systemtap 。
你可能想看看Zoom ,比起oprofile 等 ,它更加精美和功能齐备。 这需要花费(199美元),但你可以得到免费的30天的评估许可证。
LTTng是用于完整系统分析的好工具。
如果你的应用程序只是运行“扁平”(即它使用CPU或等待I / O),直到它退出,并没有其他进程竞争,只要做time myapp
(或者可能是/usr/bin/time myapp
,这会产生稍微不同的内部输出)。
这会让你像这样:
real 0m1.412s user 0m1.288s sys 0m0.056s
在这种情况下,用户+ sys(内核)时间几乎占所有的实时时间,并且只有0.068s未被记录…(可能是花在初始化加载应用程序及其支持库的时间)。
但是,如果您看到:
real 0m5.732s user 0m1.144s sys 0m0.078s
那么你的应用程序花费4.51s不占用CPU,并可能阻塞IO。 这是我认为你正在寻找的信息。
但是,这个简单的分析技术破坏的地方是:
callgrind是一个非常好的工具,但我发现OProfile更“完整”。 而且,它是唯一允许您指定模块和/或内核源代码以便更深入地了解瓶颈的程序。 输出应该是能够与KCacheGrind接口,但我有麻烦,所以我用Gprof2Dot来代替。 您可以将您的调用图导出为.png。
编辑:
OProfile查看整个系统,所以过程将是:
[设置oprofile]
opcontrol --init opcontorl --vmlinux=/path/to/vmlinux (or --no-vmlinux) opcontrol --start
[在这里运行你的应用]
opcontrol --stop (or opcontrol --shutdown [man for difference]
然后开始看结果看在opreport的手册页
valgrind中的奴才和/或helgrind工具应该允许你这样做。
google-perf-tools – 快速替代callgrind(并且可以使用与callgrind相同的格式生成输出,因此您可以使用KCacheGrind)。
看到这个职位。
而这个职位。
基本上,在程序启动和结束之间,它有一个调用堆栈。 在I / O期间,堆栈在系统调用中终止。 在计算过程中,它会以典型的指令结束。
无论哪种方式,如果你可以在随机挂钟的时间对栈进行采样,你可以清楚地看到为什么花费那么多时间。
唯一剩下的就是 – 成千上万的样本可能会给人一种自信的感觉,但他们不会告诉你十多二十个样本。