在Linux上的性能分析

什么是在* nix上分析C / C ++应用程序的最佳工具?

(我希望能够分析一个混合了(阻塞)文件IO,networkingepoll和fork()/ execv()的服务器,但是一般的帮助和更多的常规工具也是值得赞赏的。)

你能在一个概述中看到RAM,CPU,networking和磁盘的大系统图,并钻入它吗?

在内核列表上有很多关于perf timechart ,但是我还没有发现Ubuntu上的任何东西。

Solutions Collecting From Web of "在Linux上的性能分析"

我建议采取stackshots, pstack是有用的。 以下是更多信息:

  1. gprof的评论。

  2. stackshots如何工作。

  3. 一个吹的例子。

  4. 一个非常简短的解释。

如果你想花钱, 缩放看起来像一个不错的工具。

为了表现,您可以尝试使用Valgrind工具Callgrind。 这是一篇很好的文章,展示了它的行动 。

完整的系统分析工具(适用于Solaris,OS X,FreeBSD)的典型示例是DTrace 。 但是在Linux上它还没有完全可用(你可以在这里尝试,但是目前这个网站已经关闭了,而我自己也没有尝试过)。 有许多工具,在各种有用的状态下,在Linux上进行完整的系统分析和内核分析。

你可能会考虑调查:

  • oprofile的
  • SystemTap的
  • bootchart
  • strace(例如这个答案

Allinea MAP是Linux上C ++和其他本地语言的一个分析器。 这是我的雇主的商业支持。 它有一个图形界面和源代码级别分析和配置文件代码几乎没有减速,这使得其他子系统的时间相关的非常准确 – 如IO。

Callgrind是有用的和准确的 – 但减速是~5倍,所以我只能做更小的运行。 它实际上可以计算函数被调用的次数,这对于理解渐近行为很有用。

用-pg编译,运行该程序,然后使用gprof

使用-pg编译(和链接)将分析代码和分析库添加到可执行文件,然后生成一个名为gmon.out的文件,其中包含计时信息。 gprof显示调用图表及其(绝对和相对)时间。

有关详细信息,请参阅man gprof

oprofile可能会让你感兴趣。 Ubuntu应该有你需要的所有软件包。

如果你可以把你的应用程序移植到FreeBSD,OS X或Solaris上,你可以使用dtrace,尽管dtrace是一个面向分析的工具 – 也就是说,你需要驱动它 – 阅读:脚本。 没有其他任何东西可以给你你需要的粒度水平; Dtrace不能简单地分析用户域中函数调用的延迟; 它也可以跟随上下文切换到内核。

正如在接受的答案中提到的, Zoom可以做一些了不起的事情。 我已经用它来理解线程行为,直到优化编译器生成的程序集。

在这里使用-gp和gproff的描述http://www.ibm.com/developerworks/library/l-gnuprof.html

如前所述,FOSS的答案是用-pg构建,然后使用gprof来分析输出。 如果这是一个产品/项目,可以投入一些资金,我也会试图使用IBM / Rationals Quantify分析器,因为这样可以更轻松地查看性能分析数据,深入到行级别或者在“10000ft '水平。

当然可能有gprof可用的浏览器可以做同样的事情,但我不知道任何。