#![allow(deprecated)]
use dial9::analysis::analysis_events::{CpuSampleSource, Dial9Event};
use dial9::cpu::SchedEventConfig;
use dial9::format::Decoder;
use dial9::{Dial9HandleTokioExt, RecorderPerfExt, TokioAttachOptions};
use dial9::{DiskBuffer, recorder};
use std::time::Duration;
async fn blocking_task(id: usize) {
for _ in 0..5 {
std::thread::sleep(Duration::from_millis(10));
tokio::task::yield_now().await;
}
eprintln!("Task {id} done");
}
fn main() {
let trace_dir = "example-traces";
std::fs::create_dir_all(trace_dir).unwrap();
let trace_base = format!("{trace_dir}/kernel_sched_trace.bin");
let trace_read_path = format!("{trace_dir}/kernel_sched_trace.0.bin");
let writer = DiskBuffer::single_file(&trace_base).unwrap();
let recorder = recorder(writer)
.with_sched_events(
SchedEventConfig::default()
.sampling_interval(5)
.include_kernel(true),
)
.build();
let mut builder = tokio::runtime::Builder::new_multi_thread();
builder.enable_all().worker_threads(2);
let rt = recorder
.handle()
.attach_tokio_runtime(
builder,
TokioAttachOptions::builder()
.task_tracking_enabled(true)
.build(),
)
.expect("build tokio runtime");
rt.block_on(async {
let tasks: Vec<_> = (0..4).map(|i| tokio::spawn(blocking_task(i))).collect();
for t in tasks {
let _ = t.await;
}
});
drop(rt);
drop(recorder);
eprintln!("\n=== Reading trace from {trace_read_path} ===");
let data = std::fs::read(&trace_read_path).unwrap();
let mut decoder = Decoder::new(&data).unwrap();
let mut printed = 0;
let mut total_samples = 0;
decoder
.for_each_event(|raw| {
let ev: Dial9Event = raw.deserialize().expect("deserialize");
if let Dial9Event::CpuSampleEvent(ref s) = ev {
if s.source != CpuSampleSource::SchedEvent {
return;
}
total_samples += 1;
if printed < 3 {
printed += 1;
eprintln!(
"\n--- SchedEvent sample #{printed} (worker {}) ---",
s.worker_id
);
for addr in &s.callchain {
eprintln!(" {addr:#x}");
}
}
}
})
.unwrap();
eprintln!("\nTotal sched event samples: {total_samples}");
if total_samples == 0 {
eprintln!("No samples! Check: sudo sysctl kernel.perf_event_paranoid=1");
}
}