使用 perf 进行 JIT 性能分析

perf 是 Linux 上可用的一个性能分析工具,它能够测量诸如周期、执行的指令、缓存未命中等性能事件,并提供汇编和源代码注释。可以在 Linux 上使用 perf 收集 SpiderMonkey JIT 的性能分析数据,并使用编译过程中使用的 IR 操作码对生成的汇编进行注释,如下所示。

构建设置

要启用使用 perf jitdump 进行 JIT 性能分析,必须使用以下标志构建 Firefox 或 JS shell

ac_add_options --enable-perf

环境变量

必须为 perf JIT 性能分析定义的环境变量

PERF_SPEW_DIR: jitdump 输出文件的存储位置。将此目录设置为 tmpfs 文件系统可以帮助减少开销。
IONPERF: 有效选项包括:funcsrcirir-ops

IONPERF=func 将禁用所有注释,并且仅提供函数名。这是最快的选项。
IONPERF=ir 将启用 IR 注释。
IONPERF=ir-ops 将启用带有操作数支持的 IR 注释。**需要 –enable-jitspew** 并为“ir”添加额外的开销。
IONPERF=src 将启用源代码注释,**前提是** perf 可以本地读取源文件。仅在 JS shell 中效果良好。

对 JS shell 进行性能分析

对 JS shell 进行性能分析需要以下命令,但非常简单。

首先删除任何预先存在的 jitdump 文件

rm -rf outputrm -f jitted-*.so jit.data perf.data jit-*.dump jitdump-*.txt

接下来定义环境变量

export IONPERF=ir
export PERF_SPEW_DIR=output

运行您的测试用例,并附加 perf

perf record -g -k 1 /home/denis/src/mozilla-central/obj-js/dist/bin/js test.js

将 jitdump 文件注入到 perf.data 文件中

perf inject -j -i perf.data -o jit.data

查看性能分析结果

perf report --no-children --call-graph=graph,0 -i jit.data

以上所有命令都可以放入一个 shell 脚本中。

对浏览器进行性能分析

对浏览器进行性能分析比对 shell 进行性能分析要复杂一些,但主要区别在于 perf 必须在内容进程运行时附加到它。

首先删除任何预先存在的 jitdump 文件

rm -rf outputrm -f jitted-*.so jit.data perf.data jit-*.dump jitdump-*.txt

接下来定义环境变量

export IONPERF=ir
export PERF_SPEW_DIR=output
export MOZ_DISABLE_CONTENT_SANDBOX=1

运行 Firefox 浏览器

~/mozilla-central/obj-opt64/dist/bin/firefox -profile ~/mozilla-central/obj-opt64/tmp/profile-default &

导航到测试用例,但不要立即开始。然后将鼠标悬停在选项卡上以获取内容进程的 PID。

附加 perf 以开始性能分析

perf record -g -k 1 -p <pid>

基准测试完成后关闭浏览器。

将 jitdump 文件注入到 perf.data 文件中

perf inject -j -i perf.data -o jit.data

查看性能分析结果(–call-graph=graph,0 显示所有调用堆栈,而不是默认的 >= 0.5% 阈值)

perf report --no-children --call-graph=graph,0 -i jit.data

其他信息

某些 Linux 发行版提供了一个“libc6-prof”包,其中包含帧指针。这有助于解析涉及 libc 调用的符号和调用堆栈。

在 Ubuntu 上,您可以使用以下命令安装它:

sudo apt-get install libc6-prof

libc6-prof 可以与 LD_LIBRARY_PATH=/lib/libc6-prof/x86_64-linux-gnu 一起使用。

在性能分析期间访问内核地址也可能很有用。可以使用以下命令公开这些地址:

sudo sh -c "echo 0 > /proc/sys/kernel/kptr_restrict"

默认情况下,最大堆栈深度为 127。这通常太少了。可以使用以下命令增加它:

sudo sh -c "echo 4000 > /proc/sys/kernel/perf_event_max_stack"