Linux perf-tools非常适合在CPU周期中查找热点并优化这些热点。但是一旦某些部件被并行化,就很难发现顺序部件,因为它们需要占用大量的时间,但不一定需要很多CPU周期(并行部件已经烧掉了这些部件)。
避免XY问题:我的潜在动机是在多线程代码中找到顺序瓶颈。并行阶段很容易控制聚合CPU周期统计数据,即使顺序阶段由amdahl's law引起的时间占主导地位。
对于java应用程序,使用具有线程利用时间轴的visualvm或yourkit相当容易实现。
请注意,它显示了所选范围或时间点的线程状态(可运行,等待,阻止)和堆栈样本。
如何在Linux上实现与perf或其他原生剖析器相媲美的东西?它不一定是GUI可视化,只是一种查找与它们相关的顺序瓶颈和CPU样本的方法。
答案 0 :(得分:3)
Oracle's Developer Studio Performance Analyzer可能会完全满足您的需求。 (如果您在Solaris上运行,我知道它会将完全按照您的要求进行操作,但是我从未在Linux上使用过它,并且现在无法访问Linux系统适合尝试)。
这是在x86 Solaris 11系统上运行的多线程IO测试程序的屏幕截图:
请注意,您可以看到每个线程的调用堆栈以及确切的线程交互方式-在发布的示例中,您可以看到实际执行IO的线程的起始位置,并且每个线程都可以看到他们表演。
此视图准确显示线程2在突出显示的时刻的位置:
此视图已启用同步事件视图,显示线程2在突出显示的时间段内停留在sem_wait
调用中。请注意图形数据的其他行,其中显示了同步事件(sem_wait()
,pthread_cond_wait()
,pthread_mutex_lock()
等):
其他视图包括呼叫树:
线程概述(仅对少数几个线程不是很有用,但是如果您有数百个或更多线程,则可能非常有用
和显示功能CPU利用率的视图
您会看到在每一行代码上花费了多少时间:
毫不奇怪,正在编写一个大文件以测试IO性能的过程几乎全部时间都花在了write()
函数中。
有关Oracle的完整摘要,请访问https://www.oracle.com/technetwork/server-storage/solarisstudio/documentation/o11-151-perf-analyzer-brief-1405338.pdf
快速用法概述:
collect
实用程序收集性能数据。参见https://docs.oracle.com/cd/E77782_01/html/E77798/afadm.html#scrolltoc analyzer
GUI来分析上面收集的数据。答案 1 :(得分:2)
您可以使用我们用于分析CPU外部分析的强大工具-Off-CPU Flame Graphs来获得所需的结果
我使用了Flame Graphs
CPU外分析是一种性能方法,其中可以测量和研究CPU外时间以及诸如堆栈跟踪之类的上下文。它与CPU分析不同,后者仅检查线程是否在CPU上执行。
此工具基于您提到的首选工具-perf,bcctools,但是,它提供了一个真正易于使用的输出,称为Flame graph,该交互式SVG文件看起来像Off-CPU analysis。
宽度与代码路径中的总时间成正比,因此首先寻找最宽的信号塔,以了解最大的延迟源。从左到右的顺序没有意义,y轴是堆栈深度。
作为CPU外火焰图的一部分的2个有用的分析也可以为您提供帮助-就我个人而言,我没有尝试过。
与唤醒CPU信息可以解释阻塞的真正原因相比,这使我们比单独使用CPU跟踪解决了更多的问题。
还有Wakeup
链图是一种实验可视化,将CPU外堆栈与其唤醒堆栈相关联
还有一个实验可视化,结合了CPU和非CPU火焰图Chain Graph
这在一张图中显示了所有线程时间,并允许直接比较CPU上和CPU外代码路径的持续时间。
需要花费一些时间来阅读此概要分析工具并理解其概念,但是,与上面提到的其他工具相比,使用它非常简单,并且其输出更易于分析。
祝你好运!