如何在Linux上剖析我的C ++应用程序

我想在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。 这是我认为你正在寻找的信息。

但是,这个简单的分析技术破坏的地方是:

  • 在计时器/时钟或其他外部刺激(例如事件驱动的GUI应用程序)上等待的应用程序。 它无法区分等待时间和等待磁盘/网络的时间。
  • 多线程应用程序,需要更多的思考解释数字。

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期间,堆栈在系统调用中终止。 在计算过程中,它会以典型的指令结束。

无论哪种方式,如果你可以在随机挂钟的时间对栈进行采样,你可以清楚地看到为什么花费那么多时间。

唯一剩下的就是 – 成千上万的样本可能会给人一种自信的感觉,但他们不会告诉你十多二十个样本。