diff options
author | Adam Hess <HParker@github.com> | 2023-04-13 07:07:07 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-13 10:07:07 -0400 |
commit | 854baee2c936006d7f38ebb27ee577c00afc6249 (patch) | |
tree | c5bb8bf804adccc29a1af4065c62365dba9445c4 /yjit/src/stats.rs | |
parent | 02a7e12b80823919fb614ad3ea6241d5115d14fe (diff) | |
download | ruby-854baee2c936006d7f38ebb27ee577c00afc6249.tar.gz |
YJIT: Add a sampling option to exit tracing (#7693)
Add a sampling option to trace exits
Running YJIT with trace exits enabled can make very large metrics files.
This allows us to configure a sample rate to make tracing exits possible
on larger tests. This also updates the documented YJIT options.
Co-authored-by: Alan Wu <XrXr@users.noreply.github.com>
Co-authored-by: John Hawthorn <john@hawthorn.email>
Co-authored-by: Maxime Chevalier-Boisvert <maximechevalierb@gmail.com>
Diffstat (limited to 'yjit/src/stats.rs')
-rw-r--r-- | yjit/src/stats.rs | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/yjit/src/stats.rs b/yjit/src/stats.rs index f937c6e625..42b7de7a59 100644 --- a/yjit/src/stats.rs +++ b/yjit/src/stats.rs @@ -26,7 +26,9 @@ pub struct YjitExitLocations { raw_samples: Vec<VALUE>, /// Vec to hold line_samples which represent line numbers of /// the iseq caller. - line_samples: Vec<i32> + line_samples: Vec<i32>, + /// Number of samples skipped when sampling + skipped_samples: usize } /// Private singleton instance of yjit exit locations @@ -47,7 +49,8 @@ impl YjitExitLocations { let yjit_exit_locations = YjitExitLocations { raw_samples: Vec::new(), - line_samples: Vec::new() + line_samples: Vec::new(), + skipped_samples: 0 }; // Initialize the yjit exit locations instance @@ -71,6 +74,11 @@ impl YjitExitLocations { &mut YjitExitLocations::get_instance().line_samples } + /// Get the number of samples skipped + pub fn get_skipped_samples() -> &'static mut usize { + &mut YjitExitLocations::get_instance().skipped_samples + } + /// Mark the data stored in YjitExitLocations::get_raw_samples that needs to be used by /// rb_yjit_add_frame. YjitExitLocations::get_raw_samples are an array of /// VALUE pointers, exit instruction, and number of times we've seen this stack row @@ -573,6 +581,15 @@ pub extern "C" fn rb_yjit_record_exit_stack(exit_pc: *const VALUE) return; } + if get_option!(trace_exits_sample_rate) > 0 { + if get_option!(trace_exits_sample_rate) <= *YjitExitLocations::get_skipped_samples() { + YjitExitLocations::get_instance().skipped_samples = 0; + } else { + YjitExitLocations::get_instance().skipped_samples += 1; + return; + } + } + // rb_vm_insn_addr2opcode won't work in cargo test --all-features // because it's a C function. Without insn call, this function is useless // so wrap the whole thing in a not test check. |