Linux上的线程利用率分析

时间:2017-07-22 05:51:11

标签: linux multithreading performance profiling perf

Linux perf-tools非常适合在CPU周期中查找热点并优化这些热点。但是一旦某些部件被并行化,就很难发现顺序部件,因为它们需要占用大量的时间,但不一定需要很多CPU周期(并行部件已经烧掉了这些部件)。

避免XY问题:我的潜在动机是在多线程代码中找到顺序瓶颈。并行阶段很容易控制聚合CPU周期统计数据,即使顺序阶段由amdahl's law引起的时间占主导地位。

对于java应用程序,使用具有线程利用时间轴的visualvm或yourkit相当容易实现。

yourkit thread timeline

请注意,它显示了所选范围或时间点的线程状态(可运行,等待,阻止)和堆栈样本。

如何在Linux上实现与perf或其他原生剖析器相媲美的东西?它不一定是GUI可视化,只是一种查找与它们相关的顺序瓶颈和CPU样本的方法。

2 个答案:

答案 0 :(得分:3)

Oracle's Developer Studio Performance Analyzer可能会完全满足您的需求。 (如果您在Solaris上运行,我知道它会将完全按照您的要求进行操作,但是我从未在Linux上使用过它,并且现在无法访问Linux系统适合尝试)。

这是在x86 Solaris 11系统上运行的多线程IO测试程序的屏幕截图:

Screenshot of multithreaded IO performance test prorgam

请注意,您可以看到每个线程的调用堆栈以及确切的线程交互方式-在发布的示例中,您可以看到实际执行IO的线程的起始位置,并且每个线程都可以看到他们表演。

此视图准确显示线程2在突出显示的时刻的位置:

enter image description here

此视图已启用同步事件视图,显示线程2在突出显示的时间段内停留在sem_wait调用中。请注意图形数据的其他行,其中显示了同步事件(sem_wait()pthread_cond_wait()pthread_mutex_lock()等):

enter image description here

其他视图包括呼叫树:

enter image description here

线程概述(仅对少数几个线程不是很有用,但是如果您有数百个或更多线程,则可能非常有用

enter image description here

和显示功能CPU利用率的视图

enter image description here

您会看到在每一行代码上花费了多少时间:

enter image description here

毫不奇怪,正在编写一个大文件以测试IO性能的过程几乎全部时间都花在了write()函数中。

有关Oracle的完整摘要,请访问https://www.oracle.com/technetwork/server-storage/solarisstudio/documentation/o11-151-perf-analyzer-brief-1405338.pdf

快速用法概述:

答案 1 :(得分:2)

您可以使用我们用于分析CPU外部分析的强大工具-Off-CPU Flame Graphs来获得所需的结果

我使用了Flame Graphs

  

CPU外分析是一种性能方法,其中可以测量和研究CPU外时间以及诸如堆栈跟踪之类的上下文。它与CPU分析不同,后者仅检查线程是否在CPU上执行。

此工具基于您提到的首选工具-perf,bcctools,但是,它提供了一个真正易于使用的输出,称为Flame graph,该交互式SVG文件看起来像Off-CPU analysis

SVG Off-CPU Time Flame Graph

  

宽度与代码路径中的总时间成正比,因此首先寻找最宽的信号塔,以了解最大的延迟源。从左到右的顺序没有意义,y轴是堆栈深度。

作为CPU外火焰图的一部分的2个有用的分析也可以为您提供帮助-就我个人而言,我没有尝试过。

enter image description here

  

与唤醒CPU信息可以解释阻塞的真正原因相比,这使我们比单独使用CPU跟踪解决了更多的问题。

还有Wakeup

  

链图是一种实验可视化,将CPU外堆栈与其唤醒堆栈相关联

还有一个实验可视化,结合了CPU和非CPU火焰图Chain Graph

  

这在一张图中显示了所有线程时间,并允许直接比较CPU上和CPU外代码路径的持续时间。

需要花费一些时间来阅读此概要分析工具并理解其概念,但是,与上面提到的其他工具相比,使用它非常简单,并且其输出更易于分析。

祝你好运!