diff options
author | Takashi Kokubun <takashikkbn@gmail.com> | 2023-10-18 14:07:03 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-18 21:07:03 +0000 |
commit | f51b92fe231266a1a184b8329d43520599d2017b (patch) | |
tree | d5a1e218714a894e83b86981676f94f742114d76 /doc | |
parent | 58ee088bb36874d4c63ef55e0d3287bb07ead9d2 (diff) | |
download | ruby-f51b92fe231266a1a184b8329d43520599d2017b.tar.gz |
YJIT: Add --yjit-perf (#8697)
Co-authored-by: Alan Wu <alansi.xingwu@shopify.com>
Diffstat (limited to 'doc')
-rw-r--r-- | doc/yjit/yjit.md | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/doc/yjit/yjit.md b/doc/yjit/yjit.md index b1a4d5f022..4c1984ca6b 100644 --- a/doc/yjit/yjit.md +++ b/doc/yjit/yjit.md @@ -173,6 +173,7 @@ compiled, lower values mean less code is compiled (default 200000) - `--yjit-trace-exits`: produce a Marshal dump of backtraces from specific exits. Automatically enables `--yjit-stats` - `--yjit-max-versions=N`: maximum number of versions to generate per basic block (default 4) - `--yjit-greedy-versioning`: greedy versioning mode (disabled by default, may increase code size) +- `--yjit-perf`: Enable frame pointers and perf profiling Note that there is also an environment variable `RUBY_YJIT_ENABLE` which can be used to enable YJIT. This can be useful for some deployment scripts where specifying an extra command-line option to Ruby is not practical. @@ -428,3 +429,30 @@ While in your i386 shell, install Cargo and Homebrew, then hack away! 2. Cargo will install in $HOME/.cargo by default, and I don't know a good way to change architectures after install If you use Fish shell you can [read this link](https://tenderlovemaking.com/2022/01/07/homebrew-rosetta-and-ruby.html) for information on making the dev environment easier. + +## Profiling with Linux perf + +`--yjit-perf` allows you to profile JIT-ed methods along with other native functions using Linux perf. +When you run Ruby with `perf record`, perf looks up `/tmp/perf-{pid}.map` to resolve symbols in JIT code, +and this option lets YJIT write method symbols into that file as well as enabling frame pointers. + +Here's an example way to use this option with [Firefox Profiler](https://profiler.firefox.com) +(See also: [Profiling with Linux perf](https://profiler.firefox.com/docs/#/./guide-perf-profiling)): + +```bash +# Compile the interpreter with frame pointers enabled +./configure --enable-yjit --prefix=$HOME/.rubies/ruby-yjit --disable-install-doc cflags=-fno-omit-frame-pointer +make -j && make install + +# [Optional] Allow running perf without sudo +echo 0 | sudo tee /proc/sys/kernel/kptr_restrict +echo -1 | sudo tee /proc/sys/kernel/perf_event_paranoid + +# Profile Ruby with --yjit-perf +cd ../yjit-bench +perf record --call-graph fp -- ruby --yjit-perf -Iharness-perf benchmarks/liquid-render/benchmark.rb + +# View results on Firefox Profiler https://profiler.firefox.com. +# Create /tmp/test.perf as below and upload it using "Load a profile from file". +perf script --fields +pid > /tmp/test.perf +``` |