From 8f260fcb6f597dc1c243715a14336e38a5acef10 Mon Sep 17 00:00:00 2001 From: CongkaiTan Date: Tue, 26 May 2026 11:17:24 -0700 Subject: [PATCH] Add --save-profile-events to write all parsed events to text file --- src/data.rs | 4 + src/data/java_profile.rs | 11 +- src/data/perf_profile.rs | 8 + src/lib.rs | 2 + src/profiling/jfr/convert.rs | 623 +++++++++++++++++----------------- src/profiling/jfr/mod.rs | 2 +- src/profiling/jfr/reader.rs | 14 - src/profiling/perf/parser.rs | 50 +-- src/record.rs | 11 +- tests/jfr_compare.rs | 123 ------- tests/jfr_fixtures/test_0.jfr | Bin 226446 -> 0 bytes tests/test_aperf.rs | 2 + 12 files changed, 383 insertions(+), 467 deletions(-) delete mode 100644 tests/jfr_compare.rs delete mode 100644 tests/jfr_fixtures/test_0.jfr diff --git a/src/data.rs b/src/data.rs index 8062af23..7adddd2c 100644 --- a/src/data.rs +++ b/src/data.rs @@ -77,6 +77,7 @@ pub struct CollectorParams { pub runlog: PathBuf, pub pmu_config: Option, pub perf_frequency: u32, + pub save_profile_events: bool, pub hotline_frequency: u32, pub interval: u64, pub num_to_report: u32, @@ -97,6 +98,7 @@ impl CollectorParams { runlog: PathBuf::new(), pmu_config: None, perf_frequency: 99, + save_profile_events: false, hotline_frequency: 1000, interval: 1, num_to_report: 5000, @@ -153,6 +155,8 @@ impl DataType { self.collector_params.profile = param.profile.clone(); self.collector_params.tmp_dir = param.tmp_dir.clone(); self.collector_params.runlog = param.runlog.clone(); + self.collector_params.perf_frequency = param.perf_frequency; + self.collector_params.save_profile_events = param.save_profile_events; self.collector_params.pmu_config = param.pmu_config.clone(); self.collector_params.interval = param.interval; self.collector_params.hotline_frequency = param.hotline_frequency; diff --git a/src/data/java_profile.rs b/src/data/java_profile.rs index f6bbc488..836ee352 100644 --- a/src/data/java_profile.rs +++ b/src/data/java_profile.rs @@ -343,7 +343,16 @@ impl CollectData for JavaProfileRaw { "{}-java-profile-{}-profiler-data.json", params.run_name, key )); - match jfr::jfr_to_profiler(&jfr_path) { + + let event_out_path_buf = + params.data_dir.join(format!("parsed_jfr_events_{key}.out")); + let events_out_path = if params.save_profile_events { + Some(event_out_path_buf.as_path()) + } else { + None + }; + + match jfr::build_java_profiler_data(&jfr_path, events_out_path) { Ok(mut profiler) => { profiler.metadata = jfr::parse_jfr_metadata(&metadata_json); if let Ok(json) = serde_json::to_string(&profiler) { diff --git a/src/data/perf_profile.rs b/src/data/perf_profile.rs index b7a45459..756654ff 100644 --- a/src/data/perf_profile.rs +++ b/src/data/perf_profile.rs @@ -136,10 +136,18 @@ impl CollectData for PerfProfileRaw { Ok(_) => debug!("'perf record' executed successfully."), } + let event_out_path_buf = params.data_dir.join("parsed_perf_data.out"); + let events_out_path = if params.save_profile_events { + Some(event_out_path_buf.as_path()) + } else { + None + }; + // Parse raw Perf profile and build ProfilingData let perf_profiler_data = build_perf_profiler_data( ¶ms.data_file_path, *PROFILE_START_TIME_MS.lock().unwrap(), + events_out_path, ); let perf_profiler_data_path = params .data_dir diff --git a/src/lib.rs b/src/lib.rs index 20255b86..53695832 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -543,6 +543,7 @@ pub struct InitParams { pub tmp_dir: PathBuf, pub runlog: PathBuf, pub perf_frequency: u32, + pub save_profile_events: bool, pub hotline_frequency: u32, pub num_to_report: u32, /// Wall-clock start of `collect_data_serial`. `None` for archives @@ -592,6 +593,7 @@ impl InitParams { tmp_dir: PathBuf::from(APERF_TMP), runlog: PathBuf::new(), perf_frequency: 99, + save_profile_events: false, hotline_frequency: 1000, num_to_report: 5000, collection_start: None, diff --git a/src/profiling/jfr/convert.rs b/src/profiling/jfr/convert.rs index 7c0f5f38..f2105224 100644 --- a/src/profiling/jfr/convert.rs +++ b/src/profiling/jfr/convert.rs @@ -2,33 +2,66 @@ use crate::data::common::data_formats::{KeyValueData, Profiler}; use crate::profiling::jfr::{ExecSampleType, JfrEvent, JfrReader}; use crate::profiling::{FrameType, ThreadState}; use anyhow::Result; +use chrono::{TimeZone, Utc}; +use log::{debug, warn}; use serde_json::Value; use std::collections::HashMap; -use std::fmt::Write; +use std::fs::File; +use std::io::Write; use std::path::Path; +use std::time::Instant; -/// This converts a JFR to string output, and should be equivalent to jfr print function. -/// Only used for validating data parsing. -pub fn format_jfr(path: &Path) -> Result { - let mut out = String::new(); - let mut reader = JfrReader::open(path.to_str().unwrap())?; +/// This function uses JfrReader to parse async-profiler generated JFR files into +/// APerf data Profiler. +pub fn build_java_profiler_data( + jfr_path: &Path, + events_output_path: Option<&Path>, +) -> Result { + debug!("Start parsing raw JFR records..."); + let jfr_parse_start_time = Instant::now(); + + let mut reader = JfrReader::open(jfr_path.to_str().unwrap())?; + + let mut events_output_file = if let Some(events_output_path) = events_output_path { + if let Ok(events_output_file) = File::create(events_output_path) { + Some(events_output_file) + } else { + warn!( + "Failed to create file {} to save the JFR events", + events_output_path.display() + ); + None + } + } else { + None + }; - writeln!(out, "start_nanos: {}", reader.start_nanos)?; - writeln!(out, "end_nanos: {}", reader.end_nanos)?; - writeln!( - out, - "chunk ticks_per_sec: {}", - reader.chunk_info.ticks_per_sec - )?; - writeln!(out, "threads: {}", reader.threads.len())?; - writeln!(out, "methods: {}", reader.methods.len())?; - writeln!(out, "stack_traces: {}", reader.stack_traces.len())?; - writeln!(out, "classes: {}", reader.classes.len())?; - writeln!(out, "strings: {}", reader.strings.len())?; - writeln!(out, "enums: {:?}", reader.enums)?; - writeln!(out, "settings: {:?}", reader.settings)?; - writeln!(out, "---")?; + let frame_type_suffix: HashMap = reader + .enums + .get("jdk.types.FrameType") + .map(|m| { + m.iter() + .map(|(&k, v)| (k as u8, FrameType::from_jfr_name(v).literal_suffix())) + .collect() + }) + .unwrap_or_default(); + let thread_state_map = reader + .enums + .get("jdk.types.ThreadState") + .cloned() + .unwrap_or_default(); + // Cache: (method_id, frame_type) -> formatted frame string + let mut formatted_frame_name_cache: HashMap<(i64, u8), String> = HashMap::new(); + // Cache: class_id -> humanized class name string + let mut humanized_class_name_cache: HashMap = HashMap::new(); + + let mut profiler = Profiler::new(reader.start_nanos / 1_000_000); + if let Some(file) = events_output_file.as_mut() { + let _ = write_jfr_out_header(file, &reader); + } + + let mut num_samples: usize = 0; loop { match reader.read_event() { Ok(JfrEvent::EndOfChunk) => { @@ -37,164 +70,294 @@ pub fn format_jfr(path: &Path) -> Result { } } Ok(event) => { - let time_nanos = reader.chunk_info.event_time_to_nanos(event.time()); - let secs = time_nanos / 1_000_000_000; - let nanos_rem = (time_nanos % 1_000_000_000).unsigned_abs(); - let h = (secs / 3600) % 24; - let m = (secs / 60) % 60; - let s = secs % 60; - let ms = nanos_rem / 1_000_000; - let time_str = format!("{:02}:{:02}:{:02}.{:03}", h, m, s, ms); - - let tid = event.tid(); - let thread_name = reader.resolve_thread(tid as i64).unwrap_or_default(); - let java_tid = reader.java_thread_ids.get(&(tid as i64)).copied(); - - match &event { + let sample_time_ms = reader.chunk_info.event_time_to_millis(event.time()); + + if let Some(file) = events_output_file.as_mut() { + let _ = + write_jfr_out_event(file, &event, &mut humanized_class_name_cache, &reader); + } + + let (profile_type, thread_state, samples) = match &event { JfrEvent::ExecutionSample(e) => { - let state = reader - .enums - .get("jdk.types.ThreadState") - .and_then(|m| m.get(&e.thread_state)) - .cloned() - .unwrap_or_else(|| format!("STATE_{}", e.thread_state)); - let type_name = match e.sample_type { - ExecSampleType::Execution => "jdk.ExecutionSample", - ExecSampleType::NativeMethod => "jdk.NativeMethodSample", - ExecSampleType::WallClock => "profiler.WallClockSample", - ExecSampleType::CpuTime => "jdk.CPUTimeSample", - }; - writeln!(out, "{} {{", type_name)?; - writeln!(out, " startTime = {}", time_str)?; - write_thread_field(&mut out, "sampledThread", &thread_name, tid, java_tid)?; - writeln!(out, " state = \"{}\"", state)?; - if e.sample_type == ExecSampleType::WallClock { - writeln!(out, " samples = {}", e.samples)?; - } - } - JfrEvent::AllocationSample(e) => { - let cls = jvm_type_to_human(&reader.resolve_class(e.class_id as i64)); - let type_name = if e.tlab_size > 0 { - "jdk.ObjectAllocationInNewTLAB" - } else { - "jdk.ObjectAllocationOutsideTLAB" - }; - writeln!(out, "{} {{", type_name)?; - writeln!(out, " startTime = {}", time_str)?; - writeln!(out, " objectClass = {} (classLoader = null)", cls)?; - writeln!( - out, - " allocationSize = {}", - format_bytes(e.allocation_size) - )?; - if e.tlab_size > 0 { - writeln!(out, " tlabSize = {}", format_bytes(e.tlab_size))?; - } - write_thread_field(&mut out, "eventThread", &thread_name, tid, java_tid)?; - } - JfrEvent::ContendedLock(e) => { - let cls = jvm_type_to_human(&reader.resolve_class(e.class_id as i64)); - writeln!(out, "jdk.JavaMonitorEnter {{")?; - writeln!(out, " startTime = {}", time_str)?; - writeln!(out, " duration = {} ns", e.duration)?; - writeln!(out, " monitorClass = {}", cls)?; - write_thread_field(&mut out, "eventThread", &thread_name, tid, java_tid)?; - } - JfrEvent::LiveObject(e) => { - let cls = jvm_type_to_human(&reader.resolve_class(e.class_id as i64)); - writeln!(out, "profiler.LiveObject {{")?; - writeln!(out, " startTime = {}", time_str)?; - writeln!(out, " objectClass = {}", cls)?; - writeln!( - out, - " allocationSize = {}", - format_bytes(e.allocation_size) - )?; - writeln!(out, " allocationTime = {}", e.allocation_time)?; - } - JfrEvent::MallocEvent(e) => { - let type_name = if e.size > 0 { - "profiler.Malloc" - } else { - "profiler.Free" + let ptype = match e.sample_type { + ExecSampleType::Execution + | ExecSampleType::NativeMethod + | ExecSampleType::CpuTime => "cpu", + ExecSampleType::WallClock => "wall", }; - writeln!(out, "{} {{", type_name)?; - writeln!(out, " startTime = {}", time_str)?; - writeln!(out, " address = 0x{:x}", e.address)?; - if e.size > 0 { - writeln!(out, " size = {}", format_bytes(e.size))?; - } - } - JfrEvent::MethodTrace(e) => { - writeln!(out, "jdk.MethodTrace {{")?; - writeln!(out, " startTime = {}", time_str)?; - writeln!(out, " duration = {} ns", e.duration)?; - writeln!(out, " method = {}", e.method)?; - } - JfrEvent::NativeLock(e) => { - writeln!(out, "profiler.NativeLock {{")?; - writeln!(out, " startTime = {}", time_str)?; - writeln!(out, " duration = {} ns", e.duration)?; - writeln!(out, " address = 0x{:x}", e.address)?; - } - JfrEvent::Custom(_) => { - writeln!(out, "CustomEvent {{")?; - writeln!(out, " startTime = {}", time_str)?; + let state_name = thread_state_map + .get(&e.thread_state) + .map(|s| s.as_str()) + .unwrap_or(""); + (ptype, ThreadState::from_str(state_name), e.samples as u64) } - JfrEvent::EndOfChunk => unreachable!(), - } + JfrEvent::AllocationSample(_) => ("alloc", ThreadState::None, 1u64), + _ => continue, + }; + + num_samples += 1; if let Some(trace) = reader.stack_traces.get(&(event.stack_trace_id() as i64)) { - writeln!(out, " stackTrace = [")?; - for (i, &method_id) in trace.methods.iter().enumerate() { - let loc = trace.locations[i]; - let line = loc >> 16; - if let Some((cls, method, sig)) = reader.resolve_method(method_id) { - let sig_str = if sig.is_empty() || sig.starts_with("[unknown") { - String::new() - } else { - format_signature(&sig) - }; - writeln!( - out, - " {}.{}({}) line: {}", - cls.replace('/', "."), - method, - sig_str, - line - )?; - } else { - writeln!(out, " [unknown:{}]() line: {}", method_id, line)?; - } + let mut frames: Vec = trace + .methods + .iter() + .zip(trace.types.iter()) + .rev() + .map(|(&method_id, &frame_type)| { + formatted_frame_name_cache + .entry((method_id, frame_type)) + .or_insert_with(|| { + let suffix = + frame_type_suffix.get(&frame_type).copied().unwrap_or(""); + if let Some((cls, method, _)) = reader.resolve_method(method_id) + { + if frame_type == 3 || frame_type == 4 || cls.is_empty() { + format!("{}{}", method, suffix) + } else if method.is_empty() { + format!("{}{}", cls.replace('/', "."), suffix) + } else { + format!( + "{}.{}{}", + cls.replace('/', "."), + method, + suffix + ) + } + } else { + format!("[unknown:{}]{}", method_id, suffix) + } + }) + .clone() + }) + .collect(); + + if let JfrEvent::AllocationSample(e) = &event { + let cls = humanized_class_name_cache + .entry(e.class_id as i64) + .or_insert_with(|| { + jvm_type_to_human(&reader.resolve_class(e.class_id as i64)) + }); + let frame = format!("{}{}", cls, FrameType::Inlined.literal_suffix()); + frames.push(frame); } - writeln!(out, " ]")?; - } - writeln!(out, "}}")?; - writeln!(out)?; + if !frames.is_empty() { + profiler.insert_stack( + profile_type, + sample_time_ms, + thread_state, + &frames, + samples, + ); + } + } } Err(e) => return Err(e.into()), } } - Ok(out) + + debug!( + "Finished parsing {num_samples} JFR samples in {:?}", + jfr_parse_start_time.elapsed() + ); + + Ok(profiler) +} + +fn write_jfr_out_header(out_file: &mut File, reader: &JfrReader) -> Result<()> { + writeln!(out_file, "start_nanos: {}", reader.start_nanos)?; + writeln!(out_file, "end_nanos: {}", reader.end_nanos)?; + writeln!( + out_file, + "chunk ticks_per_sec: {}", + reader.chunk_info.ticks_per_sec + )?; + writeln!(out_file, "threads: {}", reader.threads.len())?; + writeln!(out_file, "methods: {}", reader.methods.len())?; + writeln!(out_file, "stack_traces: {}", reader.stack_traces.len())?; + writeln!(out_file, "classes: {}", reader.classes.len())?; + writeln!(out_file, "strings: {}", reader.strings.len())?; + writeln!(out_file, "enums: {:?}", reader.enums)?; + writeln!(out_file, "settings: {:?}", reader.settings)?; + writeln!(out_file, "---")?; + + Ok(()) +} + +fn write_jfr_out_event( + out_file: &mut File, + event: &JfrEvent, + humanized_class_name_cache: &mut HashMap, + reader: &JfrReader, +) -> Result<()> { + let time_nanos = reader.chunk_info.event_time_to_nanos(event.time()); + let date_time = Utc.timestamp_nanos(time_nanos); + let time_str = date_time.format("%H:%M:%S%.3f (%Y-%m-%d)").to_string(); + + let tid = event.tid(); + let thread_name = reader.resolve_thread(tid as i64).unwrap_or_default(); + let java_tid = reader.java_thread_ids.get(&(tid as i64)).copied(); + + match &event { + JfrEvent::ExecutionSample(e) => { + let state = reader + .enums + .get("jdk.types.ThreadState") + .and_then(|m| m.get(&e.thread_state)) + .cloned() + .unwrap_or_else(|| format!("STATE_{}", e.thread_state)); + let type_name = match e.sample_type { + ExecSampleType::Execution => "jdk.ExecutionSample", + ExecSampleType::NativeMethod => "jdk.NativeMethodSample", + ExecSampleType::WallClock => "profiler.WallClockSample", + ExecSampleType::CpuTime => "jdk.CPUTimeSample", + }; + writeln!(out_file, "{} {{", type_name)?; + writeln!(out_file, " startTime = {}", time_str)?; + write_thread_field(out_file, "sampledThread", &thread_name, tid, java_tid)?; + writeln!(out_file, " state = \"{}\"", state)?; + if e.sample_type == ExecSampleType::WallClock { + writeln!(out_file, " samples = {}", e.samples)?; + } + } + JfrEvent::AllocationSample(e) => { + let cls = humanized_class_name_cache + .entry(e.class_id as i64) + .or_insert_with(|| jvm_type_to_human(&reader.resolve_class(e.class_id as i64))); + let type_name = if e.tlab_size > 0 { + "jdk.ObjectAllocationInNewTLAB" + } else { + "jdk.ObjectAllocationOutsideTLAB" + }; + writeln!(out_file, "{} {{", type_name)?; + writeln!(out_file, " startTime = {}", time_str)?; + writeln!(out_file, " objectClass = {} (classLoader = null)", cls)?; + writeln!( + out_file, + " allocationSize = {}", + format_bytes(e.allocation_size) + )?; + if e.tlab_size > 0 { + writeln!(out_file, " tlabSize = {}", format_bytes(e.tlab_size))?; + } + write_thread_field(out_file, "eventThread", &thread_name, tid, java_tid)?; + } + JfrEvent::ContendedLock(e) => { + let cls = humanized_class_name_cache + .entry(e.class_id as i64) + .or_insert_with(|| jvm_type_to_human(&reader.resolve_class(e.class_id as i64))); + writeln!(out_file, "jdk.JavaMonitorEnter {{")?; + writeln!(out_file, " startTime = {}", time_str)?; + writeln!(out_file, " duration = {} ns", e.duration)?; + writeln!(out_file, " monitorClass = {}", cls)?; + write_thread_field(out_file, "eventThread", &thread_name, tid, java_tid)?; + } + JfrEvent::LiveObject(e) => { + let cls = humanized_class_name_cache + .entry(e.class_id as i64) + .or_insert_with(|| jvm_type_to_human(&reader.resolve_class(e.class_id as i64))); + writeln!(out_file, "profiler.LiveObject {{")?; + writeln!(out_file, " startTime = {}", time_str)?; + writeln!(out_file, " objectClass = {}", cls)?; + writeln!( + out_file, + " allocationSize = {}", + format_bytes(e.allocation_size) + )?; + writeln!(out_file, " allocationTime = {}", e.allocation_time)?; + } + JfrEvent::MallocEvent(e) => { + let type_name = if e.size > 0 { + "profiler.Malloc" + } else { + "profiler.Free" + }; + writeln!(out_file, "{} {{", type_name)?; + writeln!(out_file, " startTime = {}", time_str)?; + writeln!(out_file, " address = 0x{:x}", e.address)?; + if e.size > 0 { + writeln!(out_file, " size = {}", format_bytes(e.size))?; + } + } + JfrEvent::MethodTrace(e) => { + writeln!(out_file, "jdk.MethodTrace {{")?; + writeln!(out_file, " startTime = {}", time_str)?; + writeln!(out_file, " duration = {} ns", e.duration)?; + writeln!(out_file, " method = {}", e.method)?; + } + JfrEvent::NativeLock(e) => { + writeln!(out_file, "profiler.NativeLock {{")?; + writeln!(out_file, " startTime = {}", time_str)?; + writeln!(out_file, " duration = {} ns", e.duration)?; + writeln!(out_file, " address = 0x{:x}", e.address)?; + } + JfrEvent::Custom(_) => { + writeln!(out_file, "CustomEvent {{")?; + writeln!(out_file, " startTime = {}", time_str)?; + } + JfrEvent::EndOfChunk => unreachable!(), + } + + if let Some(trace) = reader.stack_traces.get(&(event.stack_trace_id() as i64)) { + writeln!(out_file, " stackTrace = [")?; + for (i, &method_id) in trace.methods.iter().enumerate() { + let loc = trace.locations[i]; + let line = loc >> 16; + if let Some((cls, method, sig)) = reader.resolve_method(method_id) { + let sig_str = if sig.is_empty() || sig.starts_with("[unknown") { + String::new() + } else { + format_signature(&sig) + }; + writeln!( + out_file, + " {}.{}({}) line: {}", + cls.replace('/', "."), + method, + sig_str, + line + )?; + } else { + writeln!(out_file, " [unknown:{}]() line: {}", method_id, line)?; + } + } + writeln!(out_file, " ]")?; + } + + writeln!(out_file, "}}")?; + writeln!(out_file)?; + + Ok(()) } fn write_thread_field( - out: &mut String, + out_file: &mut File, field: &str, name: &str, tid: i32, java_tid: Option, -) -> std::fmt::Result { +) -> Result<()> { if name.is_empty() { - return writeln!(out, " {} = N/A", field); + writeln!(out_file, " {} = N/A", field)?; + return Ok(()); } if let Some(jtid) = java_tid { if jtid > 0 { - return writeln!(out, " {} = \"{}\" (javaThreadId = {})", field, name, jtid); + writeln!( + out_file, + " {} = \"{}\" (javaThreadId = {})", + field, name, jtid + )?; + return Ok(()); } } - writeln!(out, " {} = \"{}\" (osThreadId = {})", field, name, tid) + writeln!( + out_file, + " {} = \"{}\" (osThreadId = {})", + field, name, tid + )?; + + Ok(()) } fn jvm_type_to_human(name: &str) -> String { @@ -279,156 +442,6 @@ fn parse_type(chars: &mut std::iter::Peekable) -> String { } } -/// This function uses JfrReader to parse async-profiler generated JFR files into -/// APerf Profiler. -pub fn jfr_to_profiler(path: &Path) -> Result { - let mut reader = JfrReader::open(path.to_str().unwrap())?; - let start_time_ms = reader.start_nanos / 1_000_000; - - let frame_type_suffix: HashMap = reader - .enums - .get("jdk.types.FrameType") - .map(|m| { - m.iter() - .map(|(&k, v)| (k as u8, FrameType::from_jfr_name(v).literal_suffix())) - .collect() - }) - .unwrap_or_default(); - - let thread_state_map = reader - .enums - .get("jdk.types.ThreadState") - .cloned() - .unwrap_or_default(); - - let mut profiler = Profiler::new(start_time_ms); - // Computed lazily after settings are populated from ActiveSetting events - let mut wall_interval_ms: Option = None; - - // Cache: (method_id, frame_type) -> formatted frame string - let mut frame_cache: HashMap<(i64, u8), String> = HashMap::new(); - // Cache: class_id -> formatted alloc class string - let mut alloc_class_cache: HashMap = HashMap::new(); - - loop { - match reader.read_event() { - Ok(JfrEvent::EndOfChunk) => { - if !reader.has_more_chunks().unwrap_or(false) { - break; - } - } - Ok(event) => { - let sample_time_ms = reader.chunk_info.event_time_to_millis(event.time()); - - let (profile_type, thread_state, samples) = match &event { - JfrEvent::ExecutionSample(e) => { - let ptype = match e.sample_type { - ExecSampleType::Execution - | ExecSampleType::NativeMethod - | ExecSampleType::CpuTime => "cpu", - ExecSampleType::WallClock => "wall", - }; - let state_name = thread_state_map - .get(&e.thread_state) - .map(|s| s.as_str()) - .unwrap_or(""); - (ptype, ThreadState::from_str(state_name), e.samples as u64) - } - JfrEvent::AllocationSample(_) => ("alloc", ThreadState::None, 1u64), - _ => continue, - }; - - if let Some(trace) = reader.stack_traces.get(&(event.stack_trace_id() as i64)) { - let mut frames: Vec = trace - .methods - .iter() - .zip(trace.types.iter()) - .rev() - .map(|(&mid, &ftype)| { - frame_cache - .entry((mid, ftype)) - .or_insert_with(|| { - let suffix = - frame_type_suffix.get(&ftype).copied().unwrap_or(""); - if let Some((cls, method, _)) = reader.resolve_method(mid) { - if ftype == 3 || ftype == 4 || cls.is_empty() { - format!("{}{}", method, suffix) - } else if method.is_empty() { - format!("{}{}", cls.replace('/', "."), suffix) - } else { - format!( - "{}.{}{}", - cls.replace('/', "."), - method, - suffix - ) - } - } else { - format!("[unknown:{}]{}", mid, suffix) - } - }) - .clone() - }) - .collect(); - - if let JfrEvent::AllocationSample(e) = &event { - let frame = alloc_class_cache - .entry(e.class_id as i64) - .or_insert_with(|| { - let cls = - jvm_type_to_human(&reader.resolve_class(e.class_id as i64)); - format!("{}{}", cls, FrameType::Inlined.literal_suffix()) - }) - .clone(); - frames.push(frame); - } - - if !frames.is_empty() { - // Wall clock events with samples > 1 represent consecutive sampling - // intervals. Spread them across time blocks to match async-profiler - // heatmap behavior. - // Source https://github.com/async-profiler/async-profiler/blob/20e0b5cfc344bf5e32e5554750c2b08462c353b8/src/converter/one/convert/JfrToHeatmap.java#L34 - if profile_type == "wall" && samples > 1 { - let interval = *wall_interval_ms.get_or_insert_with(|| { - reader - .settings - .get("wall") - .or_else(|| reader.settings.get("interval")) - .and_then(|s| s.parse::().ok()) - .filter(|&v| v > 0) - .unwrap_or(50_000_000) - / 1_000_000 - }); - let mut time_ms = sample_time_ms; - for _ in 0..samples { - profiler.insert_stack( - profile_type, - time_ms, - thread_state, - &frames, - 1, - ); - time_ms += interval; - } - } else { - profiler.insert_stack( - profile_type, - sample_time_ms, - thread_state, - &frames, - samples, - ); - } - } - } - } - Err(e) => return Err(e.into()), - } - } - - Ok(profiler) -} - // Reference: https://github.com/async-profiler/async-profiler/blob/master/src/jfrMetadata.h#L46-L70 fn jfr_event_type_name(id: &str) -> Option<&'static str> { match id { diff --git a/src/profiling/jfr/mod.rs b/src/profiling/jfr/mod.rs index 7bcf8d0b..cc1dfd72 100644 --- a/src/profiling/jfr/mod.rs +++ b/src/profiling/jfr/mod.rs @@ -8,7 +8,7 @@ mod convert; mod reader; mod types; -pub use convert::{format_jfr, jfr_to_profiler, parse_jfr_metadata}; +pub use convert::{build_java_profiler_data, parse_jfr_metadata}; pub use reader::JfrReader; pub use types::*; diff --git a/src/profiling/jfr/reader.rs b/src/profiling/jfr/reader.rs index 2003bac7..d51dd612 100644 --- a/src/profiling/jfr/reader.rs +++ b/src/profiling/jfr/reader.rs @@ -20,20 +20,6 @@ enum State { /// JFR binary format reader. Iterates chunk-by-chunk, event-by-event. /// Based on async-profiler implementation: https://github.com/async-profiler/async-profiler/tree/master /// src/converter/one/jfr -/// -/// Usage: -/// -/// ```ignore -/// let mut reader = JfrReader::open("recording.jfr")?; -/// while reader.has_more_chunks()? { -/// loop { -/// match reader.read_event()? { -/// JfrEvent::EndOfChunk => break, -/// event => { /* process event */ } -/// } -/// } -/// } -/// ``` #[derive(Default)] pub struct JfrReader { data: Vec, diff --git a/src/profiling/perf/parser.rs b/src/profiling/perf/parser.rs index 6812380e..274c3870 100644 --- a/src/profiling/perf/parser.rs +++ b/src/profiling/perf/parser.rs @@ -8,17 +8,18 @@ use crate::profiling::ThreadState; use anyhow::Result; use linux_perf_data::{PerfFileReader, PerfFileRecord}; use linux_perf_event_reader::{EventRecord, RawData, SampleRecord}; -use log::{debug, error}; +use log::{debug, error, warn}; use std::env; use std::fs::File; use std::io::{BufReader, Write}; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use std::time::Instant; /// Parse the raw Perf profile and build the Profiler Data. pub fn build_perf_profiler_data( perf_data_path: &PathBuf, profile_start_timestamp_ms: i64, + events_output_path: Option<&Path>, ) -> Profiler { debug!("Start parsing raw Perf profile..."); @@ -33,7 +34,8 @@ pub fn build_perf_profiler_data( } }; debug!( - "Raw Perf Data was parsed in {:?}", + "Finished parsing {} Perf samples in {:?}", + perf_samples.len(), perf_parse_start_time.elapsed() ); @@ -54,17 +56,23 @@ pub fn build_perf_profiler_data( } }; - // TODO: writing the stack output is for development only. Remove after verification step completes - let mut stack_output_file = perf_data_path - .parent() - .map(|parent_dir| { - File::create(PathBuf::from(parent_dir).join("parsed_perf_data.out")).unwrap() - }) - .unwrap(); + let mut stack_output_file = if let Some(events_output_path) = events_output_path { + if let Ok(file) = File::create(events_output_path) { + Some(file) + } else { + warn!( + "Failed to create file {} to save the Perf events", + events_output_path.display() + ); + None + } + } else { + None + }; let build_perf_profiler_data_start_time = Instant::now(); let profile_type = "cpu"; - for perf_sample in perf_samples { + for perf_sample in &perf_samples { let mut frames: Vec = perf_sample .call_chain .iter() @@ -80,14 +88,15 @@ pub fn build_perf_profiler_data( let sample_timestamp_ms = system_boot_timestamp_ms + (perf_sample.timestamp / 1_000_000) as i64; - // TODO: for development only. Remove after verification step completes. - writeln!( - stack_output_file, - "{}|{}|{}", - sample_timestamp_ms, - perf_sample.pid, - frames.join(";") - ); + if let Some(file) = stack_output_file.as_mut() { + let _ = writeln!( + file, + "{}|{}|{}", + sample_timestamp_ms, + perf_sample.pid, + frames.join(";") + ); + } profiler.insert_stack( profile_type, @@ -98,7 +107,8 @@ pub fn build_perf_profiler_data( ); } debug!( - "Perf Profiler Data was built in {:?}", + "Finished building Perf ProfilerData for {} samples in {:?}", + perf_samples.len(), build_perf_profiler_data_start_time.elapsed() ); diff --git a/src/record.rs b/src/record.rs index 2189f66c..ea62205d 100644 --- a/src/record.rs +++ b/src/record.rs @@ -60,12 +60,12 @@ pub struct Record { pub collect_only: Option>, /// Gather profiling data using 'perf' binary. - #[clap(help_heading = "Perf Profiling", long, value_parser)] + #[clap(help_heading = "Profiling", long, value_parser)] pub profile: bool, /// Frequency for perf profiling (Hz). #[clap( - help_heading = "Perf Profiling", + help_heading = "Profiling", short = 'F', long, value_parser, @@ -75,7 +75,7 @@ pub struct Record { /// Profile JVMs using async-profiler. Specify args using comma separated values. Profiles all JVMs if no args are provided. #[clap( - help_heading = "Java Profiling", + help_heading = "Profiling", long, value_parser, default_missing_value = Some("jps"), value_names = &["PID/Name>,,...,, + /// Save all profile events in the output file. + #[clap(help_heading = "Profiling", long, value_parser)] + pub save_profile_events: bool, + /// Custom PMU config file to use. #[clap(help_heading = "PMU Options", long, value_parser)] pub pmu_config: Option, @@ -155,6 +159,7 @@ pub fn record(record: &Record, tmp_dir: &Path, runlog: &Path) -> Result<()> { if record.profile { params.perf_frequency = record.perf_frequency; } + params.save_profile_events = record.save_profile_events; let mut performance_data = PerformanceData::new(params); diff --git a/tests/jfr_compare.rs b/tests/jfr_compare.rs deleted file mode 100644 index ba0c750e..00000000 --- a/tests/jfr_compare.rs +++ /dev/null @@ -1,123 +0,0 @@ -use aperf::profiling::jfr::format_jfr; -use std::collections::HashMap; -use std::fs; -use std::path::Path; -use std::process::Command; - -const JFR_EVENTS: &str = "jdk.ExecutionSample,jdk.NativeMethodSample,profiler.WallClockSample,jdk.MethodTrace,jdk.ObjectAllocationInNewTLAB,jdk.ObjectAllocationOutsideTLAB,jdk.ObjectAllocationSample,profiler.LiveObject,jdk.JavaMonitorEnter,jdk.ThreadPark,profiler.Malloc,profiler.Free,jdk.CPUTimeSample,profiler.NativeLock"; - -fn parse_events(output: &str) -> HashMap { - let text = if let Some(pos) = output.find("\n---\n") { - &output[pos + 5..] - } else { - output - }; - - let mut events: HashMap = HashMap::new(); - let mut current = Vec::new(); - - for line in text.lines() { - if line.trim().is_empty() && !current.is_empty() { - let event = current.join("\n").trim().to_string(); - if !event.is_empty() { - *events.entry(event).or_default() += 1; - } - current.clear(); - } else { - current.push(line); - } - } - if !current.is_empty() { - let event = current.join("\n").trim().to_string(); - if !event.is_empty() { - *events.entry(event).or_default() += 1; - } - } - events -} - -fn run_jfr_print(jfr_path: &Path) -> String { - let output = Command::new("jfr") - .args(["print", "--stack-depth", "999", "--events", JFR_EVENTS]) - .arg(jfr_path) - .output() - .expect("failed to run jfr"); - assert!( - output.status.success(), - "jfr print failed: {}", - String::from_utf8_lossy(&output.stderr) - ); - String::from_utf8(output.stdout).expect("jfr output not utf8") -} - -#[cfg(target_os = "linux")] -#[test] -fn compare_jfr_outputs() { - let fixtures = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/jfr_fixtures"); - let mut tested = 0; - - for entry in std::fs::read_dir(&fixtures).expect("cannot read jfr_fixtures dir") { - let path = entry.unwrap().path(); - if path.extension().and_then(|e| e.to_str()) != Some("jfr") { - continue; - } - - let name = path.file_name().unwrap().to_string_lossy(); - println!("Testing: {}", name); - - let gt_raw = run_jfr_print(&path); - let ours_raw = format_jfr(&path).expect("format_jfr failed"); - - let ground_truth = parse_events(>_raw); - let ours = parse_events(&ours_raw); - - let gt_total: usize = ground_truth.values().sum(); - let our_total: usize = ours.values().sum(); - - let mut only_gt = Vec::new(); - let mut only_ours = Vec::new(); - - for (event, &count) in &ground_truth { - let ours_count = ours.get(event).copied().unwrap_or(0); - if count > ours_count { - only_gt.push((count - ours_count, &event[..event.len().min(120)])); - } - } - for (event, &count) in &ours { - let gt_count = ground_truth.get(event).copied().unwrap_or(0); - if count > gt_count { - only_ours.push((count - gt_count, &event[..event.len().min(120)])); - } - } - - if !only_gt.is_empty() || !only_ours.is_empty() { - let dump_dir = Path::new("/tmp/aperf_java_testing"); - fs::create_dir_all(dump_dir).ok(); - let stem = path.file_stem().unwrap().to_string_lossy(); - fs::write(dump_dir.join(format!("{}_ground_truth.out", stem)), >_raw).ok(); - fs::write(dump_dir.join(format!("{}_ours.out", stem)), &ours_raw).ok(); - - let mut msg = - format!("MISMATCH in {name} (ground_truth: {gt_total}, ours: {our_total})\n"); - msg.push_str(&format!(" Outputs saved to {}\n", dump_dir.display())); - for (count, preview) in &only_gt { - msg.push_str(&format!( - " only in ground_truth [{count}x]: {}...\n", - preview.replace('\n', " | ") - )); - } - for (count, preview) in &only_ours { - msg.push_str(&format!( - " only in ours [{count}x]: {}...\n", - preview.replace('\n', " | ") - )); - } - panic!("{}", msg); - } - - println!(" PASS ({} events)", gt_total); - tested += 1; - } - - assert!(tested > 0, "No .jfr files found in {}", fixtures.display()); -} diff --git a/tests/jfr_fixtures/test_0.jfr b/tests/jfr_fixtures/test_0.jfr deleted file mode 100644 index c4df7452dfe6598961e2b760a1ce6bbcac2de14d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226446 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 diff --git a/tests/test_aperf.rs b/tests/test_aperf.rs index 28950ce6..3f52729d 100644 --- a/tests/test_aperf.rs +++ b/tests/test_aperf.rs @@ -753,6 +753,7 @@ fn record_with_name( collect_only, profile: false, perf_frequency: 99, + save_profile_events: false, profile_java: None, pmu_config: None, hotline_frequency: 1000, @@ -768,6 +769,7 @@ fn record_with_name( collect_only, profile: false, perf_frequency: 99, + save_profile_events: false, profile_java: None, pmu_config: None, };