See where every NVMe-over-Fabrics I/O spends its time.
Stage-by-stage latency of every I/O, from the host to the drive, with eBPF on unmodified Linux.
eBPF on existing hooks.
NVMe/TCP and NVMe/RDMA; TCP in SPDK too.
4 KiB read, both sides on.
Host and target, no clock sync.
The model
One I/O, every stage of its path
Click a stage to see what it covers.
The SSD itself: from the request’s issue to the drive until its completion.
What it answers
Find the stage that breaks, not just the latency that grew
Compare a baseline with a loaded run: ntprof compare names the stage that slows down.
A busy drive shows up in storage
A second writer on the SSD: storage 2.7×, the rest unchanged.
A busy link shows up in the network
A 392 Gb/s RDMA flow: network 1.9×, storage unchanged.
Queue depth 1 → 32 over NVMe/TCP
Network 9.5×, SSD 1.1×: one TCP queue is the limit.
NVMe/RDMA: data transfer vs drive
Each request’s RDMA transfer and drive time, from one run.
Measured on real hardware
Every class of I/O, split into its stages
Same drive, two transports. Hover a segment for its time.
Means at queue depth 1 · two servers, 400 GbE RoCE, Samsung PM9A3 · NVMe/TCP’s 128 KiB numbers vary by connection.
How it works
Three steps, no kernel changes
Hook what the kernel already has
eBPF on existing tracepoints and driver functions. No patch, no reboot.
Sample the same commands on both sides
Host and target keep the same one command in N.
Join, then model the stages
Both halves matched offline; no clock sync.
git clone --recurse-submodules \
https://github.com/netlab-wisconsin/ntprof.git
cd ntprof
make && sudo make install # /usr/local/sbin/ntprof
sudo ntprof probe -r both # which hooks this kernel offers
- Two machines
- One machine
- Compare two runs
# on the target: start first, stop last
sudo ntprof record -r target -t rdma -o target.ntp
# on the host, while the workload runs
sudo ntprof record -t rdma -o host.ntp -d 30
# anywhere, with both files
ntprof report host.ntp target.ntp
# host and target on one machine (or the host alone)
sudo ntprof record -r both -d 10
ntprof compare qd1/host.ntp,qd1/target.ntp qd32/host.ntp,qd32/target.ntp
Research
Understanding and Profiling NVMe-over-TCP Using ntprof
Yuyuan Kang and Ming Liu · University of Wisconsin–Madison
22nd USENIX Symposium on Networked Systems Design and Implementation (NSDI ’25)
Where does your NVMe-oF latency go?
Two commands on two machines tell you, stage by stage.