IN THIS BREAKDOWN · 10 SECTIONS
You can read 20% of this breakdown.
The paper in one minute
In disaggregated serving (prefill and decode on different machines) and multi-turn agent serving, the KV cache moves between GPUs and machines all the time, and so do model weights during online RL. These are large "elephant" transfers on the critical path to the first token. They share the network with small, latency-critical "mice" such as MoE expert traffic.
The authors ran Mooncake Transfer Engine on thousands of GPUs and found three recurring problems with the usual design, where the application binds a transfer to a transport and set of NICs at setup and the engine stripes it evenly. Silos: NVLink and RDMA descriptors don't mix, so paths like "remote DRAM to local GPU over NVLink" fall back to TCP. Stranding: even striping ignores a slow, congested or cross-NUMA rail, and the whole transfer waits for it. Fragility: one cluster logged 382 hardware failures a month, and each link fault surfaced as an application error needing manual repair.
TENT inverts the design. The application declares an intent (source, destination, length, priority) and gets a handle. The engine then works in three phases. Orchestration picks transports per request from a unified view of memory segments and their reachable links, and can stage through host or GPU memory to stitch a multi-hop path. Slice spraying cuts large transfers into slices of at least 64 KB, each carrying its absolute destination offset, and sends each slice to the rail with the lowest predicted finish time, β0 + β1·(queued bytes + L)/bandwidth, using live telemetry. Resilience marks rails healthy, degraded or paused, retries failed slices on other rails (safe because writes go to fixed offsets), and can switch transport entirely.
In SGLang's hierarchical KV cache, TENT gave 1.36x the input throughput of Mooncake TE and lower time to first token; RL weight updates ran 20-26% faster; a NIC failure caused a sub-50 ms dip with no errors. It is open source in the Mooncake repository.
Research notes: the problem, approach and results
input throughput over Mooncake Transfer Engine in SGLang HiCache, Qwen3-235B-A22B on two 8xH800 nodes
throughput dip when a NIC fails mid-transfer; the NIC rejoined 26 ms after recovery, with no application-visible error
hardware failure events per month at one fintech production cluster, 72% of them GPU-related
Disaggregated and agentic serving moves KV caches and model weights between machines constantly, over a mix of NVLink, multi-rail RDMA and PCIe paths. Existing transfer engines bind each transfer to a backend and NIC set up front and split it evenly, so one slow, congested or failed link stalls the whole transfer, and a link fault surfaces as an application error.
Make transfers declarative. Applications state source, destination, length and priority; the engine picks transports per request, can stitch multi-hop paths through staging memory, and cuts large transfers into 64 KB+ slices with absolute offsets. Each slice goes to the rail with the lowest predicted finish time from live queue and bandwidth telemetry; failing rails are excluded and their slices retried elsewhere.
In SGLang HiCache serving Qwen3-235B over 10-turn conversations, TENT raised input throughput 1.36x and cut P90 time to first token from 0.90 to 0.67 s against Mooncake Transfer Engine. RL weight updates were 20-26% faster, and a failed NIC cost under 50 ms of reduced throughput with no application errors.
Why it matters to an FDE
Every serving optimization that moves KV between machines (prefix caching across nodes, prefill/decode disaggregation, multi-turn session caches) assumes the transfer is fast and reliable. In production clusters it often is neither: links degrade, NICs on the far NUMA node are slower, and something fails every couple of hours.
Tail latency comes from the slowest link. If a transfer is striped evenly, one degraded rail sets its finish time. When a customer's P90 time to first token jumps at peak hours while averages look fine, look at the transfer layer.
Failures should be routing events, not incidents. At 382 failures a month, a transfer layer that throws errors to the application means pages and restarts; one that reroutes means a brief slowdown. That difference shows up in on-call load and SLO attainment.
Cache hit rate is not the whole story. A cache that hits but transfers slowly can lose to recomputing. TENT's round-1 numbers show caching costing a little time when there is nothing to reuse; the gains come in later turns.
Understand the mechanism. Try it on a real problem.
Unlock this breakdown and 149 more papers.
Premium opens every paper in full, plus every answer, concept, course and guide on the site. One payment for six months of access.
6 months · One payment · No auto-renewal
- ◇1 architecture diagram
- </>1 runnable code experiment
- ▦2 results tables
- ?5 interview questions with answers
- 03Key takeaways
Late binding, the cost model, mice and elephants, self-healing, portability and three misreadings
Free account - 04How it works
Segments and plugins, the three phases, the scheduler, health states and the datapath
Premium - 05The numbers that matter
Serving and RL results, microbenchmarks, portability and failure tests
Premium - 06Try it yourself
Recheck the tables, spray slices around a slow rail, survive a failed rail, and protect mice
Premium - 07Where it breaks
Tuning constants, single-vendor comparisons, production claims, and slips
Premium - 08Using it on a deployment
Finding transfer-bound latency, watching rail health, traffic classes, and what to require
Premium - 09Interview angles
Five questions this paper prepares you for, with answer hints
Premium - 10Read next
Where to go from here on this site
Premium
