Status: execution deferred (by decision, 2026-06). The methodology
below stands; internal A/B numbers from the M9 pass live in
docs/perf-notes.md. When picked up again, prerequisites are: root on
the host (nvmet configfs, loop devices), a quiet machine, and ideally a
real NIC pair for the zero-copy items. Results will land in
docs/benchmark-report.md.
- ioutgt (this project), null / memory / file / block backends.
- Kernel nvmet via configfs (
bench/setup-nvmet.sh), null_blk / file / block backends — configured identically (inline data size, queue count, MDTS, digests off unless stated).
- fio with the kernel NVMe host driver, from the vmtest VM (interop-true path) and from host loopback (higher ceiling, lower variance).
- Job files in
bench/fio/: 4k-randread, 4k-randwrite, 128k-read, 128k-write, randrw-70-30; QD ∈ {1, 32, 128}; numjobs ∈ {1, 4}; 60 s runs, 10 s ramp, 3 repetitions.
IOPS, throughput, mean/p99/p99.9 latency, target CPU per IOP (pidstat), RSS, syscalls/sec (strace -c sampling run), context switches.
perf record + flamegraph on both targets at 4k-randread QD32 and 128k-read QD32; blktrace on backend device where applicable.
- CPU governor performance; pinned target threads; irqbalance off.
- Document kernel version, mitigations, NIC offloads for every run.
Each candidate (fixed buffers, multishot recv, SEND_ZC, budget tuning) is merged only if it improves ≥ one primary metric at no p99 regression on the 4 primary workloads.