【问题标题】:Performance profiling on LinuxLinux 上的性能分析
【发布时间】:2010-12-24 21:56:00
【问题描述】:

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

(我希望配置一个混合了(阻塞)文件 IO、网络 epoll 和 fork()/execv() 的服务器以进行一些繁重的工作;但也感谢一般帮助和更一般的工具.)

您能否在一个概览中全面了解 RAM、CPU、网络和磁盘的系统概况并深入研究?

kernel lists 上有很多关于 perf timechart 之类的讨论,但我在 Ubuntu 中还没有发现任何东西。

【问题讨论】:

    标签: c++ c linux performance unix


    【解决方案1】:

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

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

    详情请见man gprof

    【讨论】:

    • gprof 的问题是它不能在多线程上工作,并且很难使用动态库。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      如果您可以将您的应用程序带到 freeBSD、OS X 或 Solaris,您可以使用 dtrace,尽管 dtrace 是一个面向分析师的工具——也就是说,您需要驱动它——阅读:编写脚本。没有其他东西可以为您提供所需的粒度级别; Dtrace 不仅可以分析用户空间中函数调用的延迟;它也可以跟随上下文切换进入内核。

      【讨论】:

        【解决方案4】:

        如前所述,FOSS 的答案是使用 -pg 构建,然后使用 gprof 分析输出。如果它是一个值得投入资金的产品/项目,我也很想使用 IBM/Rationals Quantify 分析器,因为它可以更轻松地查看分析数据、深入到行级别或在 '10000 英尺范围内查看它' 级别。

        当然,可能有可用的 gprof 查看器可以做同样的事情,但我不知道。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            完整系统分析工具(适用于 Solaris、OS X、FreeBSD)的典型示例是 DTrace。但它还没有在 Linux 上完全可用(你可以试试here,但该网站目前对我来说已关闭,我自己还没有尝试过)。有许多工具可用于在 Linux 上进行完整的系统分析和内核分析。

            您可以考虑调查:

            【讨论】:

              【解决方案7】:

              我建议使用堆栈快照,pstack 对此很有用。以下是更多信息:

              1. Comments on gprof.

              2. How stackshots work.

              3. A blow-by-blow example.

              4. A very short explanation.

              如果你想花钱,Zoom 看起来是个不错的工具。

              【讨论】:

                【解决方案8】:

                为了提高性能,您可以尝试使用 Valgrind 工具 Callgrind。这是nice article showing it in action

                【讨论】:

                  【解决方案9】:

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

                  【讨论】:

                    【解决方案10】:

                    Allinea MAP 是 Linux 上 C++ 和其他本地语言的分析器。它得到了我的雇主的商业支持。它具有图形界面和源代码行级别的分析和分析代码,几乎没有减速,这使得它在其他子系统的时间相关的地方非常准确 - 例如对于 IO。

                    Callgrind 非常有用且准确 - 但速度下降了约 5 倍,因此我只能进行较小的运行。它实际上可以计算函数被调用的次数,这对于理解渐近行为很有用。

                    【讨论】:

                      猜你喜欢
                      • 2014-07-14
                      • 1970-01-01
                      • 2017-02-21
                      • 1970-01-01
                      • 2012-04-06
                      • 2014-05-26
                      • 1970-01-01
                      • 2015-04-18
                      • 2011-03-21
                      相关资源
                      最近更新 更多