【问题标题】:How to profile multi-threaded C++ application on Linux?如何在 Linux 上分析多线程 C++ 应用程序?
【发布时间】:2011-01-30 15:09:44
【问题描述】:

我曾经使用 gprof 进行所有 Linux 分析。

但是,对于我的多线程应用程序,它的输出似乎不一致。

现在,我把这个挖出来了:

http://sam.zoy.org/writings/programming/gprof.html

但是,这是很久以前的事了,在我的 gprof 输出中,我的 gprof 似乎列出了非主线程使用的函数。

所以,我的问题是:

  1. 在 2010 年,我可以轻松地使用 gprof 来分析多线程 Linux C++ 应用程序吗? (Ubuntu 9.10)
  2. 我还应该使用哪些其他工具进行分析?

【问题讨论】:

  • 最好不要像 valgrind 那样放慢速度。
  • 请告诉我替代方案,但不要告诉我替代方案。检查。
  • @stefanB :gprof 使用 g++ 的 -pg 的减速很好; valgrind 的减速至少是 10 倍
  • @dmckee @stefanB 你为什么这么苛刻? valgrind 大大减慢了程序的速度,这是一个完全有效的观察。如果可以选择的话,我也会选择最快的分析器。
  • Valgrind 的品牌忠诚度很高,尽管速度慢了 10 倍。问题是它不会按比例减慢 I/O,所以如果通常有 30% 的时间花在不必要的 I/O 上,在 Valgrind 下它看起来只有 3%。

标签: c++ multithreading profiling gprof


【解决方案1】:

编辑:在穷人的分析器上添加了另一个answer,恕我直言,它更适合多线程应用程序。

看看oprofile。该工具的分析开销可以忽略不计,并且它支持多线程应用程序——只要您不想分析互斥争用(这是分析多线程应用程序的一个非常重要的部分)

【讨论】:

  • Zoom(在 rotateright.com 下载)建立在 oprofile 之上,可以更轻松地理解数据。
  • @federal 看来你必须是root用户才能安装Zoom +_+
  • 很遗憾,RotateRight 停止维护 Zoom 并且没有发布源代码。
【解决方案2】:

看看poor man's profiler。令人惊讶的是,很少有其他工具可以为多线程应用程序同时进行 CPU 分析和互斥争用分析,而 PMP 两者都可以,而且甚至不需要安装任何东西(只要你有 gdb)。

【讨论】:

    【解决方案3】:

    看看Valgrind

    【讨论】:

    • 导致我进入这个线程的问题是 Callgrind 奇怪的调度差异以及它在单个线程中运行所有内容的事实。我试图从我的原子操作和自旋锁中找到瓶颈,单线程一切都会杀死可能导致的争用和性能问题。因此,尽管我的意愿相反,Valgrind 并不总是首选的分析器。
    【解决方案4】:

    看看Zoom

    【讨论】:

    • 好像我不是root的话是安装不了的。
    【解决方案5】:

    Paul R 说,看看 Zoom。您还可以使用 lsstack,这是一种技术含量低但效果惊人的方法,compared to gprof

    补充:既然你澄清你在 33 毫秒运行 OpenGL,我之前的建议是有效的。此外,我个人在这种情况下所做的事情既有效又不直观。只需让它在典型或有问题的工作负载下运行,然后手动停止它,看看它在做什么以及为什么。这样做几次。 现在,如果它只是偶尔行为不端,您只想在它行为不端时停止它。这并不容易,但我使用了一个闹钟中断来设置正确的延迟。例如,如果 100 帧中的一帧耗时超过 33 毫秒,则在一帧开始时,将计时器设置为 35 毫秒,并在一帧结束时将其关闭。这样,它只会在代码花费太长时间时中断,它会告诉你原因。当然,1 个样本可能会漏掉有罪代码,但 20 个样本不会漏掉。

    【讨论】:

      【解决方案6】:

      尝试现代 linux 分析工具,perf (perf_events):https://perf.wiki.kernel.org/index.php/Tutorialhttp://www.brendangregg.com/perf.html

      perf record ./application
      # generates profile file perf.data
      perf report
      

      【讨论】:

        【解决方案7】:

        您可以随机运行 pstack 以找出给定点的堆栈。例如。 10 或 20 次。 最典型的堆栈是应用程序花费最多时间的地方(根据经验,我们可以假设一个帕累托分布)。

        您可以将这些知识与 stracetruss (Solaris) 结合起来以跟踪系统调用,并将 pmap 用于内存打印。 p>

        如果应用程序在专用系统上运行,您还可以通过 sar 测量 cpu、内存、i/o 等来分析整个系统。

        【讨论】:

        【解决方案8】:

        由于您没有提到非商业性,我建议您使用英特尔的 VTune。它不是免费的,但细节水平令人印象深刻(而且开销可以忽略不计)。

        【讨论】:

          【解决方案9】:

          稍微改变一下问题,您实际上可以很好地了解使用 ftrace 和 kernelshark 在多线程应用程序中发生的事情。收集正确的跟踪并按下正确的按钮,您可以看到各个线程的调度。

          根据您的发行版内核,您可能需要构建具有正确配置的内核(但我认为现在很多人都已经构建了它)。

          【讨论】:

            【解决方案10】:

            Microprofile 是另一个可能的答案。它需要手动检测代码,但它似乎可以很好地处理多线程代码。它还具有用于分析图形管道的特殊钩子,包括卡本身内部发生的事情。

            【讨论】:

              【解决方案11】:

              我尝试了 valgrindgprof。令人遗憾的是,它们都不能很好地与多线程应用程序一起工作。后来,我找到了Intel VTune Amplifier。好消息是,它可以很好地处理多线程,适用于大多数主要语言,适用于 Windows 和 Linux,并且具有许多出色的分析功能。此外,应用程序本身是免费的。但是,它仅适用于 Intel 处理器。

              【讨论】:

                猜你喜欢
                • 2010-10-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-03-19
                • 2011-05-21
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多