【发布时间】:2017-12-28 07:17:16
【问题描述】:
Linux perf-tools 非常适合在 CPU 周期中查找热点并优化这些热点。但是,一旦某些部分被并行化,就很难发现顺序部分,因为它们占用了大量的时间,但不一定需要很多 CPU 周期(并行部分已经在消耗这些时间)。
为了避免 XY 问题:我的基本动机是在多线程代码中找到顺序瓶颈。即使由于amdahl's law,顺序阶段在墙上时间中占主导地位,并行阶段也可以轻松主导总体 CPU 周期统计数据。
对于 java 应用程序,这很容易通过具有线程利用时间线的 visualvm 或 yourkit 实现。
请注意,它会显示选定范围或时间点的线程状态(可运行、等待、阻塞)和堆栈样本。
如何在 Linux 上实现与 perf 或其他本机分析器相当的功能?它不一定是 GUI 可视化,只是一种查找顺序瓶颈和与之相关的 CPU 样本的方法。
另请参阅,更窄的followup question 专注于perf。
【问题讨论】:
-
带有时间线的屏幕截图来自跟踪工具,而不是来自分析工具。检查 kernelshark+trace-cmd 或 LTTng 跟踪器以获取 the same。 perf 是通用的,即使在默认模式下(使用 perf 脚本打印),它也可能在 perf.data 中包含一些信息;但有关线程调度的确切信息,它还应该跟踪 sched_* 事件。并且 perf 通常只分析在 CPU 上运行的线程(尤其是当您不在 AWS 或其他虚拟化上并且可能使用硬件计数器“周期”时),而不是墙时间。
-
@osgx 好吧,当线程脱离 CPU 时,我可以不用样本。原则上,我只想弄清楚它在单个线程上花费时间(〜=获取样本)期间的作用。这可能是一个 XY 问题。我的目标是找到单线程瓶颈。对我来说最明显的方法是在每个线程的基础上可视化堆栈样本。
-
perf 的默认模式是 CPU 采样分析。尝试交互式
perf report文本用户界面或“关注”某些线程的选项:perf record -g -F 99 -s ./your_program; perf report -T或perf report -T --tid=$TID其中 $TID 是一个线程的 pid 或逗号分隔列表。我没有测试 -s/-T 选项来拆分线程统计信息,但它们已记录在案:man7.org/linux/man-pages/man1/perf-record.1.htmlman7.org/linux/man-pages/man1/perf-report.1.html;每个线程是默认模式:perf.wiki.kernel.org/index.php/Tutorial#Collecting_samples -
@osgx 除非我遗漏了一些没有帮助的东西,因为它们只提供汇总统计信息。我感兴趣的不是聚合,而是只有一个线程处于活动状态的样本子集。基本上,我对代码已经并发的时间不感兴趣,但那些在报告中占主导地位的时间,即使它们可能不会主导墙壁时间。这就是 java 中的那些线程时间线视图所提供的(它们还显示特定时间片的线程堆栈 - 未在屏幕截图中显示 - 但对于弄清楚一切很重要)
-
英特尔 VTune 支持这种类型的可视化。但它只对学生和教育工作者免费。
标签: linux multithreading performance profiling perf