C++ 如何分析多线程C++;Linux上的应用程序?

C++ 如何分析多线程C++;Linux上的应用程序?,c++,multithreading,profiling,gprof,C++,Multithreading,Profiling,Gprof,我过去常常用它来做所有的Linux评测 但是,对于我的多线程应用程序,它的输出似乎不一致 现在,我找到了这个: 然而,这是很久以前的事了,在我的gprof输出中,我的gprof似乎列出了非主线程使用的函数 因此,我的问题是: 2010,我能容易地使用GPROF来配置多线程Linux C++应用程序吗?() 我应该使用哪些其他工具进行分析 看一看。看一看。编辑:在穷人档案器上添加了另一个,IMHO更适合多线程应用程序 看一看。该工具的评测开销可以忽略不计,并且它支持多线程应用程序——只要您不想

我过去常常用它来做所有的Linux评测

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

现在,我找到了这个:

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

因此,我的问题是:

  • 2010,我能容易地使用GPROF来配置多线程Linux C++应用程序吗?()
  • 我应该使用哪些其他工具进行分析

  • 看一看。

    看一看。

    编辑:在穷人档案器上添加了另一个,IMHO更适合多线程应用程序


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

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

    补充:由于您明确表示您正在以33毫秒的速度运行OpenGL,因此我先前的建议仍然有效。此外,我个人在这种情况下所做的既有效又不直观。只要让它在典型或有问题的工作负载下运行,然后手动停止它,看看它在做什么,为什么。这样做几次。
    现在,如果它只是偶尔出现不正常的行为,那么你只想在它不正常的时候停止它。这并不容易,但我已经使用了一个闹钟中断设置为恰到好处的延迟。例如,如果每100帧中有一帧的时间超过33毫秒,则在帧开始时,将计时器设置为35毫秒,在帧结束时,将其关闭。这样,它只会在代码花费太长时间时才会中断,并向您说明原因。当然,一个样本可能会漏掉犯罪代码,但20个样本不会漏掉。

    看看。令人惊讶的是,对于多线程应用程序,很少有其他工具可以同时进行CPU分析和互斥争用分析,而PMP可以同时进行这两种分析,甚至不需要安装任何东西(只要您有gdb)。

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

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


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

    尝试使用现代linux分析工具
    perf
    (perf\u事件):以及:


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

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

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


    取决于发行版的内核,您可能需要使用正确的配置构建内核(但我认为现在很多发行版都构建了内核)。

    我尝试了valgrindgprof。它们中没有一个能很好地与多线程应用程序配合使用,这真是令人遗憾。后来,我发现了。好的方面是,它处理多线程的能力很好,适用于大多数主要语言,适用于Windows和Linux,并且具有许多优秀的评测功能。此外,应用程序本身是免费的。但是,它只适用于英特尔处理器。

    最好是速度不像valgrind那么慢的处理器。请告诉我替代方案,但不要告诉我替代方案。检查。@stefanB:gprof和g++s-pg的减速是正常的;valgrind的速度慢了10倍atleast@dmckee@stefanB你为什么这么苛刻?valgrind大大减慢了程序的速度,这是一个非常有效的观察结果。如果有选择的话,我也会选择速度最快的剖析器。尽管Valgrind的速度慢了10倍,但它有很多品牌忠诚度。问题是,它不会按比例降低I/O速度,因此如果通常有30%的时间花在不必要的I/O上,那么在Valgrind下,它看起来只会是3%。Zoom(download at)建立在oprofile的基础上,使数据更容易理解。@federal似乎您必须是root用户才能安装Zoom+\u+不幸的是,RotateRight停止维护Zoom,并且还没有发布源代码。似乎如果我不是root,我就无法安装它。查看Mike Dunlavey的大多数投票帖子,他在那里证明了5个调用堆栈样本(gdb或pstack或…)在统计上就足够了。另外,profiling tag中有400篇文章:导致我想到这个线程的问题是Callgrind奇怪的调度差异,以及它在一个线程中运行所有东西的事实。我试图从我的原子操作和自旋锁中找到瓶颈,单线程一切都会杀死可能导致的争用和性能问题。因此,尽管我的愿望与此相反,Valgrind并不总是首选的剖析者。
    perf record ./application
    # generates profile file perf.data
    perf report