the*_*472 12 linux performance multithreading profiling perf
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#scrolltocanalyzerGUI 来分析上面收集的数据。