了解 perf.map

Understanding perf.map

我知道很棒的 async_profiler 工具,我用它来分析我的生产项目。在这里我想了解一下 perf 以及如何理解它的输出。

我正在尝试使用 perf 来对堆栈跟踪进行采样。我 运行 带有选项 -XX:+UnlockDiagnosticVMOptions -XX:+PreserveFramePointer -XX:+ShowHiddenFrames 的 JVM 以避免堆栈跟踪混乱。

我 运行 它与命令 sudo perf record -e cycles -g -p <my_pid> 以便对用户和内核堆栈跟踪进行采样并比较结果百分比。这是我得到的:

start_thread 符号对我来说似乎很清楚。它们来自 libjvm.so,我可以假设我 运行 我的 3 个工作线程正在做一些工作,这正是我在这里看到的。十六进制数字似乎是运行时间编译的java代码指令地址。

问题: 但是 perf-27405.map 是从哪里来的,为什么它会出现在顶部。

perf-<pid>.map 文件是一种提供 perf 特定于应用程序的符号映射的方法。

在您的例子中,其中一个采样指令指针 0x00000000008e06e0 属于 libjvm.so - perf 可以很容易地显示这一点。但另一个 0x00007f557d10c19f 属于匿名内存区域,不受任何目标文件支持。这是动态生成的代码,除非有人提供帮助,否则 perf 无法提供任何相关信息。 perf-<pid>.map 文件是应用程序或外部工具为动态生成的代码提供符号信息的接口。

perf-map-agent 是 Java 的此类工具的示例。它使用有关 JIT 编译方法的信息填充 perf-<pid>.map 文件,以便 perf 可以将这些地址映射到 Java 方法名称。