繁体   English   中英

Linux上的线程利用率分析

[英]Thread Utilization profiling on linux

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

为了避免XY问题:我的基本动机是在多线程代码中找到顺序瓶颈。 并行阶段很容易控制聚合CPU周期统计数据,即使由于amdahl定律 ,连续阶段占据了时间。

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

yourkit线程时间轴

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

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

Oracle的Developer Studio性能分析器可能完全符合您的要求。 (如果你在Solaris上运行,我知道它完全符合你的要求,但我从未在Linux上使用它,而且我现在无法访问适合尝试它的Linux系统)。

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

多线程IO性能测试prorgam的屏幕截图

请注意,您可以看到每个线程的调用堆栈以及线程如何交互 - 在发布的示例中,您可以看到实际执行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

快速使用概述:

您可以使用我们用于分析脱离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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM