Standalone · Serving

The KV cache quietly became a storage tier

Six projects are now fighting over the same territory: where the KV cache lives when it does not fit in HBM. Once you accept that the cache is a tiered store with RDMA as the bus, disaggregated serving stops being a scheduling problem and becomes a caching problem.

I spent a long time thinking about the KV cache as a memory problem: how big is it, does it fit, how do I evict. That framing is wrong, or at least it stopped being right somewhere around the point where a serving stack could spill cache to NVMe and fetch it back over RDMA faster than it could recompute it. The cache is a storage hierarchy now, and it has an ecosystem.

The tiers

The shape everyone converged on is three levels, and the naming is borrowed straight from CPU caches, which I think is a fair signal about how people are thinking:

The economics are the whole argument. Recomputing a prefill costs hundreds of milliseconds of GPU time you could have sold. Fetching the same cache from a remote NVMe tier costs tens of milliseconds of network. As long as that inequality holds, and on a fast fabric it holds comfortably, the cache belongs in storage rather than in the bin.

Who is building what

These overlap heavily and I do not think the field has settled. Worth knowing which layer each one is trying to own.

What I think this means

Two consequences I keep coming back to.

The first is that eviction policy becomes a capacity-planning decision rather than an implementation detail. If the bottom tier is effectively unbounded, you are no longer choosing what to throw away, you are choosing what to demote, and the cost of getting it wrong is a fetch rather than a recompute. Those are different orders of magnitude and they justify different amounts of cleverness.

The second is less comfortable. A tiered, distributed, RDMA-connected cache is a distributed storage system, and it will have the failure modes of one: stale reads, partial writes, hot shards, and metadata that drifts out of sync between replicas. The serving world is acquiring these problems faster than it is acquiring the operational habits that go with them, and I include myself in that.

Treating the cache as a tiered store turns disaggregated serving into a caching problem. Caching is where the real wins are, and also where the genuinely hard bugs live.

Sources