48

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

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

现在,我挖了这个:

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

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

所以,我的问题是:

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

11 回答 11

14

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

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

于 2010-03-23T06:38:18.613 回答
7

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

于 2011-09-13T09:39:39.827 回答
6

看看Valgrind

于 2010-03-23T02:38:28.027 回答
6

看看变焦

于 2010-03-23T06:21:19.440 回答
6

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

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

于 2010-03-23T15:19:46.223 回答
6

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

perf record ./application
# generates profile file perf.data
perf report
于 2017-05-30T20:30:09.007 回答
0

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

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

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

于 2016-12-15T09:27:46.300 回答
0

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

于 2017-05-30T20:53:20.637 回答
0

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

于 2018-09-06T03:58:39.237 回答
0

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

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

于 2018-09-06T04:10:35.390 回答
0

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

于 2019-07-18T14:15:50.780 回答