跳转至

系统 × 部署

系统决定 KV 存在哪里,部署决定 KV 在哪个进程里——两者的边界在 PD 分离和分布式 KV 池出现后变得模糊。

PD 分离下 Prefix Cache 应该归 P 还是归 D

PD 分离把 Prefill(P)和 Decode(D)解耦到不同进程甚至不同节点,但 prefix cache 必须存在某个地方。三种放置方案:

方案 Cache 位置 优点 缺点
归 P Prefill 节点维护 命中后直接跳过 prefill,P 节点负载降低 P 节点要维持 KV 占用 HBM,资源利用率下降
归 D Decode 节点维护 D 反正要用 KV,自然落点;无额外传输 P 节点命中后仍需计算,再传给 D
独立 KV 池(L4) 跨 P/D 共享的分布式池 命中率最高;P/D 扩缩容不影响 cache 增加一跳网络延迟;需要独立维护 KV 池

主流路线:归 D + 共享 L4 的混合

  • D 节点维护本地 prefix cache(L1/L2),处理高频热点
  • L4 层(Mooncake Store / LMCache)跨实例共享,处理冷启动和跨副本场景
  • P 节点命中 L4 后,跳过 prefill,直接把 KV 传给 D

跨节点 KV 池(L4)与本地 Cache(L1/L2)的层级关系

四级存储的层级协议:

L1: GPU HBM (本地,最快,最小)
  ↓ miss
L2: CPU DRAM (本地,快,中等)
  ↓ miss
L3: 本地 SSD (本地,慢,大)
  ↓ miss
L4: 分布式 KV 池 (跨节点,网络延迟,最大)
  ↓ miss
计算 prefill(最慢)

回填策略(Cache Fill Policy):

  • Write-through:KV 命中并使用后,立即回写到 L4——保证 L4 一致性,但增加写带宽压力
  • Write-back:KV 在本地 L1/L2 积累到一定量后,批量写入 L4——降低写带宽,但 L4 可能滞后
  • Write-on-evict:本地 block 被 LRU 驱逐时才写入 L4——最节省带宽,但驱逐时机不可控

淘汰一致性问题:

如果多个副本同时维护同一 prefix 的 KV,某个副本 evict 了一个 block,其他副本不感知——L4 需要作为"权威层",而本地层只作为 L4 的 read cache,避免一致性混乱。


Cache-aware Routing 与 Paged 内存管理的协同

路由决策需要知道"哪个副本已经有这个 prefix 的 KV",这要求推理引擎的 paged 元数据能反向暴露给 router。

当前实现方式:

  • SGLang:RadixTree 直接暴露 prefix 命中查询接口,router 可以 query 每个副本的最长匹配 prefix
  • vLLM:通过 BlockManager 暴露 cache hit 统计,Production Stack 的 router 使用 prefix hash 查询
  • Mooncake:全局 KV 池自带路由语义——block-hash 全局寻址意味着 router 天然知道哪个节点有哪个 block

接口标准化是关键开放问题:

目前各引擎暴露的格式不一致:

SGLang:  get_prefix_cache_hit(prefix_tokens) → hit_length
vLLM:    cache_hit_rate, prefix_hash → ?
TRT-LLM: 无公开标准接口

这导致路由层需要为每个引擎写适配代码。标准化的 cache metadata 协议(类似 HTTP Cache-Control)是 KV 基础设施成熟的必要条件。


关联章节

版本历史

版本 日期 说明
v0.1 2026-05-14 从维度交叉总览拆分,补充回填策略对比、淘汰一致性问题、路由接口现状