[英]Thread Utilization profiling on linux
Linux perf-tools非常适合在CPU周期中查找热点并优化这些热点。 但是,一旦某些部件被并行化,就很难发现顺序部件,因为它们占用了大量的墙壁时间,但不一定需要很多CPU周期(并行部件已经烧掉了这些部件)。
为了避免XY问题:我的基本动机是在多线程代码中找到顺序瓶颈。 并行阶段很容易控制聚合CPU周期统计数据,即使由于amdahl定律 ,连续阶段占据了时间。
对于java应用程序,使用具有线程利用时间轴的visualvm或yourkit相当容易实现。
请注意,它显示了所选范围或时间点的线程状态(可运行,等待,阻塞)和堆栈样本。
如何在Linux上实现与perf或其他原生剖析器相媲美的东西? 它不一定是GUI可视化,只是一种查找与它们相关的顺序瓶颈和CPU样本的方法。
Oracle的Developer Studio性能分析器可能完全符合您的要求。 (如果你在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以分析上面收集的数据。 您可以使用我们用于分析脱离CPU分析的优秀工具来获得您想要的结果 - 脱离CPU火焰图 ,这是火焰图的一部分
我使用了Off-CPU分析
脱离CPU分析是一种性能方法,可以测量和研究CPU外时间,以及堆栈跟踪等上下文。 它与CPU分析不同,后者只检查线程是否在CPU上执行。
这个工具基于你提到的首选工具 - perf,bcctools,然而,它提供了一个非常容易使用的输出,称为火焰图,交互式SVG文件看起来像这个SVG脱CPU时间火焰图 。
宽度与代码路径中的总时间成比例,因此首先要寻找最宽的塔,以了解最大的延迟来源。 从左到右排序没有意义,y轴是堆栈深度。
2个更有用的分析是Off-CPU Flame Graphs的一部分,也可以帮助你 - 就我个人而言,我没有尝试过。
这使得我们可以解决比单独的CPU外跟踪更多的问题,因为唤醒信息可以解释阻塞的真正原因。
和链图
链图是一种实验性可视化,它将CPU外堆栈与其唤醒堆栈相关联
还有一个实验可视化,它结合了CPU和Off-CPU火焰图热/冷火焰图
这显示了一个图形中的所有线程时间,并允许在CPU和CPU外代码路径持续时间之间进行直接比较。
它需要一点时间来阅读这个分析工具并理解它的概念,但是,使用它非常简单,其输出比上面提到的其他工具更容易分析。
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.