使用 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
: 有效选项包括:func
、src
、ir
、ir-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 output
或 rm -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 output
或 rm -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"