From fca6429e9bd8335ccd85cca68f20d8364b467faa Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 27 Mar 2026 13:01:33 +0100 Subject: [PATCH] performance-metrics: Add QCOW2 async compressed read micro benchmark Add micro_bench_qcow_async_compressed_read which reads from a zlib compressed QCOW2 image through the QcowAsync io_uring path. Compressed clusters take the sync fallback since they require decompression. Signed-off-by: Anatol Belski --- performance-metrics/src/main.rs | 26 +++++++++++++++++++- performance-metrics/src/micro_bench_block.rs | 22 +++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/performance-metrics/src/main.rs b/performance-metrics/src/main.rs index 56c6a0834..1a7956bba 100644 --- a/performance-metrics/src/main.rs +++ b/performance-metrics/src/main.rs @@ -378,7 +378,7 @@ mod adjuster { } } -const TEST_LIST: [PerformanceTest; 92] = [ +const TEST_LIST: [PerformanceTest; 94] = [ PerformanceTest { name: "boot_time_ms", func_ptr: performance_boot_time, @@ -1613,6 +1613,30 @@ const TEST_LIST: [PerformanceTest; 92] = [ }, unit_adjuster: adjuster::s_to_us, }, + PerformanceTest { + name: "micro_block_qcow_async_compressed_read_128_us", + func_ptr: micro_bench_block::micro_bench_qcow_async_compressed_read, + control: PerformanceTestControl { + test_timeout: 10, + test_iterations: 20, + warmup_iterations: 5, + num_ops: Some(128), + ..PerformanceTestControl::default() + }, + unit_adjuster: adjuster::s_to_us, + }, + PerformanceTest { + name: "micro_block_qcow_async_compressed_read_256_us", + func_ptr: micro_bench_block::micro_bench_qcow_async_compressed_read, + control: PerformanceTestControl { + test_timeout: 10, + test_iterations: 20, + warmup_iterations: 5, + num_ops: Some(256), + ..PerformanceTestControl::default() + }, + unit_adjuster: adjuster::s_to_us, + }, ]; fn run_test_with_timeout( diff --git a/performance-metrics/src/micro_bench_block.rs b/performance-metrics/src/micro_bench_block.rs index 0d485aaa4..6083c28f8 100644 --- a/performance-metrics/src/micro_bench_block.rs +++ b/performance-metrics/src/micro_bench_block.rs @@ -480,3 +480,25 @@ pub fn micro_bench_qcow_async_backing_read(control: &PerformanceTestControl) -> drain_async_completions(async_io.as_mut(), num_ops); start.elapsed().as_secs_f64() } + +/// Compressed clusters take the sync fallback in QcowAsync since they +/// require decompression. This measures decompression overhead through +/// the async code path. +/// +/// Returns the total read wall clock time in seconds. +pub fn micro_bench_qcow_async_compressed_read(control: &PerformanceTestControl) -> f64 { + let num_ops = control.num_ops.expect("num_ops required") as usize; + let (_tmp, disk) = util::compressed_qcow_async_tempfile(num_ops); + let mut async_io = disk + .new_async_io(num_ops as u32) + .expect("new_async_io failed"); + + let mut buf = vec![0u8; QCOW_CLUSTER_SIZE as usize]; + let iovec = read_iovec(&mut buf); + + let start = Instant::now(); + submit_reads(async_io.as_mut(), num_ops, QCOW_CLUSTER_SIZE, &[iovec]); + + drain_async_completions(async_io.as_mut(), num_ops); + start.elapsed().as_secs_f64() +}