solana-with-rpc-optimizations/core/benches/banking_trace.rs

170 lines
5.0 KiB
Rust
Raw Normal View History

Add fully-reproducible online tracer for banking (#29196) * Add fully-reproducible online tracer for banking * Don't use eprintln!()... * Update programs/sbf/Cargo.lock... * Remove meaningless assert_eq * Group test-only code under aptly named mod * Remove needless overflow handling in receive_until * Delay stat aggregation as it's possible now * Use Cow to avoid needless heap allocs * Properly consume metrics action as soon as hold * Trace UnprocessedTransactionStorage::len() instead * Loosen joining api over type safety for replaystage * Introce hash event to override these when simulating * Use serde_with/serde_as instead of hacky workaround * Update another Cargo.lock... * Add detailed comment for Packet::buffer serialize * Rename sender_overhead_minimized_receiver_loop() * Use type interference for TraceError * Another minor rename * Retire now useless ForEach to simplify code * Use type alias as much as possible * Properly translate and propagate tracing errors * Clarify --enable-banking-trace with better naming * Consider unclean (signal-based) node restarts.. * Tweak logging and cli * Remove Bank events as it's not needed anymore * Make tpu own banking tracer thread * Reduce diff a bit.. * Use latest serde_with * Finally use the published rolling-file crate * Make test code change more consistent * Revive dead and non-terminating test code path... * Dispose batches early now that possible * Split off thread handle very early at ::new() * Tweak message for TooSmallDirByteLimitl * Remove too much of indirection * Remove needless pub from ::channel() * Clarify test comments * Avoid needless event creation if tracer is disabled * Write tests around file rotation and spill-over * Remove unneeded PathBuf::clone()s... * Introduce inner struct instead of tuple... * Remove unused enum BankStatus... * Avoid .unwrap() for the case of disabled tracer...
2023-01-25 04:54:38 -08:00
#![feature(test)]
extern crate test;
use {
solana_core::banking_trace::{
for_test::{
drop_and_clean_temp_dir_unless_suppressed, sample_packet_batch, terminate_tracer,
},
receiving_loop_with_minimized_sender_overhead, BankingPacketBatch, BankingTracer,
TraceError, TracerThreadResult, BANKING_TRACE_DIR_DEFAULT_BYTE_LIMIT,
},
std::{
path::PathBuf,
sync::{atomic::AtomicBool, Arc},
thread,
},
tempfile::TempDir,
test::Bencher,
};
fn ensure_fresh_setup_to_benchmark(path: &PathBuf) {
// make sure fresh setup; otherwise banking tracer appends and rotates
// trace files created by prior bench iterations, slightly skewing perf
// result...
BankingTracer::ensure_cleanup_path(path).unwrap();
}
fn black_box_packet_batch(packet_batch: BankingPacketBatch) -> TracerThreadResult {
test::black_box(packet_batch);
Ok(())
}
#[bench]
fn bench_banking_tracer_main_thread_overhead_noop_baseline(bencher: &mut Bencher) {
let exit = Arc::<AtomicBool>::default();
let tracer = BankingTracer::new_disabled();
let (non_vote_sender, non_vote_receiver) = tracer.create_channel_non_vote();
let exit_for_dummy_thread = exit.clone();
let dummy_main_thread = thread::spawn(move || {
receiving_loop_with_minimized_sender_overhead::<_, TraceError, 0>(
exit_for_dummy_thread,
non_vote_receiver,
black_box_packet_batch,
)
});
let packet_batch = sample_packet_batch();
bencher.iter(|| {
non_vote_sender.send(packet_batch.clone()).unwrap();
});
terminate_tracer(tracer, None, dummy_main_thread, non_vote_sender, Some(exit));
}
#[bench]
fn bench_banking_tracer_main_thread_overhead_under_peak_write(bencher: &mut Bencher) {
let temp_dir = TempDir::new().unwrap();
let exit = Arc::<AtomicBool>::default();
let (tracer, tracer_thread) = BankingTracer::new(Some((
&temp_dir.path().join("banking-trace"),
exit.clone(),
BANKING_TRACE_DIR_DEFAULT_BYTE_LIMIT,
)))
.unwrap();
let (non_vote_sender, non_vote_receiver) = tracer.create_channel_non_vote();
let exit_for_dummy_thread = exit.clone();
let dummy_main_thread = thread::spawn(move || {
receiving_loop_with_minimized_sender_overhead::<_, TraceError, 0>(
exit_for_dummy_thread,
non_vote_receiver,
black_box_packet_batch,
)
});
let packet_batch = sample_packet_batch();
bencher.iter(|| {
non_vote_sender.send(packet_batch.clone()).unwrap();
});
terminate_tracer(
tracer,
tracer_thread,
dummy_main_thread,
non_vote_sender,
Some(exit),
);
drop_and_clean_temp_dir_unless_suppressed(temp_dir);
}
#[bench]
fn bench_banking_tracer_main_thread_overhead_under_sustained_write(bencher: &mut Bencher) {
let temp_dir = TempDir::new().unwrap();
let exit = Arc::<AtomicBool>::default();
let (tracer, tracer_thread) = BankingTracer::new(Some((
&temp_dir.path().join("banking-trace"),
exit.clone(),
1024 * 1024, // cause more frequent trace file rotation
)))
.unwrap();
let (non_vote_sender, non_vote_receiver) = tracer.create_channel_non_vote();
let exit_for_dummy_thread = exit.clone();
let dummy_main_thread = thread::spawn(move || {
receiving_loop_with_minimized_sender_overhead::<_, TraceError, 0>(
exit_for_dummy_thread,
non_vote_receiver,
black_box_packet_batch,
)
});
let packet_batch = sample_packet_batch();
bencher.iter(|| {
non_vote_sender.send(packet_batch.clone()).unwrap();
});
terminate_tracer(
tracer,
tracer_thread,
dummy_main_thread,
non_vote_sender,
Some(exit),
);
drop_and_clean_temp_dir_unless_suppressed(temp_dir);
}
#[bench]
fn bench_banking_tracer_background_thread_throughput(bencher: &mut Bencher) {
let temp_dir = TempDir::new().unwrap();
let base_path = temp_dir.path();
let packet_batch = sample_packet_batch();
bencher.iter(move || {
let path = base_path.join("banking-trace");
ensure_fresh_setup_to_benchmark(&path);
let exit = Arc::<AtomicBool>::default();
let (tracer, tracer_thread) =
BankingTracer::new(Some((&path, exit.clone(), 50 * 1024 * 1024))).unwrap();
let (non_vote_sender, non_vote_receiver) = tracer.create_channel_non_vote();
let dummy_main_thread = thread::spawn(move || {
receiving_loop_with_minimized_sender_overhead::<_, TraceError, 0>(
exit.clone(),
non_vote_receiver,
black_box_packet_batch,
)
});
for _ in 0..1000 {
non_vote_sender.send(packet_batch.clone()).unwrap();
}
terminate_tracer(
tracer,
tracer_thread,
dummy_main_thread,
non_vote_sender,
None,
);
});
drop_and_clean_temp_dir_unless_suppressed(temp_dir);
}