Troubleshooting Throughput Drops in NVMe-oF Inference Deployments
Throughput drops in NVMe-oF inference deployments are painful because they can appear intermittently, correlate with load patterns, and span multiple layers: host, fabric, or storage. This guide gives a pragmatic, measurement-first approach to isolate root causes and implement fixes that preserve inference SLOs.
Start with measurement and a repeatable baseline
Before changing anything, capture a repeatable baseline. Use real inference workloads if possible (same model, batch sizes, and arrival patterns). If you can't run production models, use representative fio profiles and model-level microbenchmarks. Key metrics to capture:
- End-to-end inference throughput and TTFT (time-to-first-token) or equivalent latency percentiles.
- Host CPU, PCIe DMA, and NIC/RDMA counters.
- NVMe controller and namespace health (via nvme-cli).
- Fabric metrics: link utilization, retransmits, PFC drops (for RoCE), and packet loss.
- Storage-side IOPS, bandwidth, queue depth, and cache hit rates.
Tools: fio (with --direct=1 and nvme plugin), iostat, nvme-cli, perf/top, blktrace, ethtool, rdma-core utilities (ibstat/rdma link stats), and eBPF traces for syscall timing.
Common root causes and the diagnostic path
- Fabric saturation or congestion
- Symptom: Throughput collapse across many hosts or sudden latency spikes
- Diagnostics: switch port counters, interface error/retry stats, RDMA retransmits, PFC storm signs
- Fixes: increase bandwidth, verify MTU/jumbo frames end-to-end, enable/adjust QoS, reduce oversubscription, tune RoCE (PFC and ECN) or move to NVMe/TCP if appropriate
- Host-side limitations (CPU, interrupts, driver/multipath)
- Symptom: single-host drop, high CPU in softirq or NVMe driver, queue depth not increasing
- Diagnostics: top/perf, interrupt balancing, examine NVMe queue statistics (nvme list/ctrl), examine NIC offloads
- Fixes: tune IRQ affinity, enable MSI-X, increase queue depth in host driver, tune multipath settings, ensure driver versions and firmware match vendor guidance
- Inadequate IO patterns or queue depth from the application
- Symptom: high small-I/O rate, low bandwidth but high IOPS, poor utilization of storage bandwidth
- Diagnostics: measure IO size distribution, queue depth per namespace, and per-core IO submission
- Fixes: batch IO where possible, increase outstanding IOs, leverage asynchronous NVMe or DPU offload, use KV cache tiering to improve read hot-paths
- Storage-side contention or garbage collection
- Symptom: periodic, correlated drops often with background processes
- Diagnostics: storage controller logs, latency histograms, GC/trimming activity indicators
- Fixes: coordinate background tasks to off-peak windows, provision additional namespace or capacity, verify write-amplification behavior
- Misconfigured NVMe-oF transport (RoCE vs TCP)
- Symptom: excellent local device performance but poor remote performance or variance across transports
- Diagnostics: compare NVMe/TCP vs RoCE results, check congestion control, PFC/ECN status
- Fixes: choose the transport that matches your datacenter fabric maturity, and tune congestion and buffer settings accordingly
Comparative view: NVMe-oF transports
| Transport | Strengths | Weaknesses | When to prefer |
|---|---|---|---|
| RDMA (RoCE/InfiniBand) | Lowest latency, high CPU efficiency | Requires lossless fabric (PFC/ECN), complex ops | High-performance clusters with trained ops teams |
| NVMe/TCP | Easier ops, works on standard IP fabrics | Slightly higher latency, depends on TCP stack tuning | Heterogeneous datacenters, simpler deployment |
| FC (NVMe/FC) | Mature SAN features | More expensive, less common for AI inference | Existing SAN-dominant environments |
Step-by-step troubleshooting checklist
- Reproduce with a controlled workload and record baseline metrics.
- Scope: is the problem per-host, per-fabric, or per-storage? Correlate timestamps across stacks.
- If fabric-related: validate link utilization, MTU, RDMA retransmit counters, and PFC behavior.
- If host-related: check CPU, interrupts, queue depths, driver versions, and multipathing.
- If storage-related: review namespace health, GC activity, and cache tier hit rates.
- Perform an A/B test: disable potential culprit (e.g., throttling QoS, switch transport, or offload) and measure delta.
- Apply fixes incrementally, using canary hosts and gate-based acceptance. If a change worsens behavior, have a stop-loss rollback ready.
Evaluation criteria for fixes
- Determinism: does the fix reduce variance in p50/p95/p99 latency?
- Reproducibility: can you reproduce improvements across multiple runs and hosts?
- Overhead: does the fix add CPU, memory, or cost overhead that negates benefits?
- Operability: does the change increase operational complexity or fragility (e.g., strict PFC reliance)?
Example mitigations that often work
- Increase application queue depth and use async NVMe APIs to saturate the link.
- End-to-end MTU and jumbo-frame verification; mismatches silently reduce throughput.
- IRQ balancing and NIC offload tuning to avoid CPU bottlenecks.
- Use KV cache tiering or a local NVMe cache for hot model weights to reduce remote load.
- Gate-based testing with built-in stop-loss to limit rollout blast radius.
Comparison table: cause vs metric vs immediate action
| Cause | Metric to watch | Immediate action |
|---|---|---|
| Fabric congestion | RDMA retransmits, switch queue length | Reduce host load, increase fabric capacity, tune QoS |
| Host CPU saturation | CPU% in softirq/irq | Rebalance IRQs, enable offloads, add cores |
| Small IO sizes | Average IO size, IOPS:BW ratio | Batch IO, increase IO size or use caching |
| Storage GC | Latency spikes at regular intervals | Reschedule GC, increase spare capacity |
Key takeaways
- Start with repeatable measurements and cross-layer correlation.
- Differentiate fabric vs host vs storage issues with targeted counters.
- Tune queue depths and IO patterns on the host before major hardware changes.
- Prefer gate-based canary rollouts with stop-loss to limit risk.
- Consider storage acceleration techniques such as KV cache tiering to reduce remote hits.
For vendor-level references and signed benchmark data that describe storage-acceleration impacts on large models, see vendor reports (example: Mingxin Technology’s FX series signed benchmarks for a 480B model showed notable throughput and TTFT improvements; reports downloadable at https://mingxinstorage.xyz). Use signed, reproducible tests as part of buy-side acceptance when selecting NVMe-oF acceleration platforms.