使用 perf_events/oprofile 在 Linux 上分析 JIT 的输出?

Posted

技术标签:

【中文标题】使用 perf_events/oprofile 在 Linux 上分析 JIT 的输出?【英文标题】:Profiling output of JIT on Linux with perf_events/oprofile? 【发布时间】:2012-10-02 19:35:06 【问题描述】:

我想使用硬件性能计数器分析由 Linux 上的 JIT 生成的代码。据我所知,最常见的分析器是oprofileperf

如何集成 JIT 和 oprofile/perf?

我的 JIT 不是 oprofile 已经支持的 JAVA。 (性能?)

例如,我们可以考虑 LLVM 的 JIT。我想要

    查看 JIT 代码中最热门的函数(它们的名称) 查看最热门函数的反汇编,并为每条指令分配性能计数器统计信息

【问题讨论】:

oprofile 可能是opagent? 对于性能,penberg@ 的补丁"perf report: Add support for profiling JIT generated code" 通过/tmp/perf-$PID.map 符号(?)文件支持 Jato JVM 的 JIT。格式为“Startaddr 大小名称\n”。 perf report 必须能读取此文件 这里是性能补丁:lkml.org/lkml/2009/6/8/499"性能报告:添加对分析 JIT 生成代码的支持" 对于 oprofile 有支持代码:llvm/lib/ExecutionEngine/OProfileJIT/OProfileWrapper.cpp 感谢lists.cs.uiuc.edu/pipermail/llvmdev/2013-March/060153.html 【参考方案1】:

要使用 perf 分析 JITed 代码,请下载、编译并安装 perf-map-agent 库,然后(对于 java 代码)添加 -agentpath:<path>/libperfmap.so 到命令行。

对于非java代码,只要生成/tmp/perf-$pid.map符号映射文件,perf 将在生成性能报告时使用它们。

Brendan Gregg 有一个 blog post,其中包含相关参考资料。

【讨论】:

seacoder,谢谢。 /tmp/perf-$pid.map的格式是什么? perf 何时在recordrecord 之后或report 子命令中访问它?如何对 JIT 生成的代码进行反汇编? 地图文件的每一行都包含 seacoder,我可以使用性能报告访问静态机器代码的反汇编,但不能访问 JIT 生成的代码。由 JIT 生成的代码在性能报告时被删除,并且该机器代码的副本不会被保存。 osgx,我没有尝试使用 perf 反汇编 JITed 代码,所以我将不得不遵从 perf 文档。

以上是关于使用 perf_events/oprofile 在 Linux 上分析 JIT 的输出?的主要内容,如果未能解决你的问题,请参考以下文章

在哪里使用 CORBA 以及在哪里使用 SNMP 进行监控?

为啥在使用 unicode 时我不能在 :before :after 内容之后使用空格

在哪里使用 callable 以及在哪里使用 Runnable Interface?

在 Observable RxSwift 中使用 'asPromise()' 可以在 PromiseKit Promise 中使用吗?

可以在 SELECT 查询中使用 IF() 但不能在 UPDATE 中使用

使用 React,在使用 react-transition-group 时,在 StrictMode 中不推荐使用 findDOMNode 作为警告