缓存在哪台机器上:前缀复用、路由与搬运成本
从热缓存节点排队更长的情况出发,比较本地命中、远端搬运与重新计算,解释命中率为何不能单独决定路由。
同一段长 system prompt 被反复使用时,把请求发给已经持有它的 worker 很自然。但如果这台 worker 的队列已经很长,命中缓存的请求可能比另一台机器重新计算还慢。
这时路由器有几种选择:等持有缓存的 worker 空出来,把 KV 搬到另一台机器,或者让空闲机器重新计算。每一种都能继续处理请求,代价却不同。下面沿着首 token 返回前的路径,把排队、查找、搬运和剩余计算放在一起比较。
文本相似不代表 KV 可以复用
Prefix Cache 对应的是兼容计算状态下的精确 token 前缀。句子语义相近,甚至显示文本相同,都不足以独立证明可复用:tokenizer、聊天模板、模型权重、适配器和位置处理等都可能影响实际计算。
Radix tree 可以把共享的 token 前缀组织起来,查找请求与已有路径的最长匹配部分。它解决索引问题,不会让语义相似的段落变成等价 KV,也不会替系统处理模型版本变化。实际引擎还可能按块边界组织匹配。
因此,缓存目录至少要让路由器知道:哪一段兼容前缀可能存在、位于哪里、可复用多长、目录信息有多新。目录过期时,路由器认为命中的块可能已经被驱逐。执行端必须能回退到正常计算,而不是依赖一次查找结果永远成立。
比较的是首 token 前的剩余路径
对候选 worker,可以用下面的近似式整理成本:
是预计排队, 是查找与准备, 是需要搬运时的传输, 是剩余 Prefill, 是首 token 的其他处理。这个加法适合梳理串行路径;存在重叠时应按实际关键路径计算,不能把所有耗时机械相加。
用一组假设时间说明取舍,暂时忽略两端相同的固定开销:
| 候选 | 排队 | 缓存准备与剩余计算 | 预计等待 |
|---|---|---|---|
| 热 worker | 250 ms | 20 ms | 270 ms |
| 冷 worker | 30 ms | 180 ms | 210 ms |
这个例子里,热 worker 少做了 160 ms 的准备与计算,却多等了 220 ms,结果反而晚了 60 ms。数值只是用于说明取舍。实际估计排队时间时,还要看前面请求的长度和阶段,不能只数队列里有几个人。
路由器可以先做兼容性过滤,再在队列负载与可复用长度之间评分。为了避免全部请求追逐同一个热节点,还要限制热点倾斜,并定期校准预计耗时与实际结果。不存在一个只最大化命中率就能自动优化所有请求延迟的规则。
从 CPU 或远端搬 KV,要付多少成本
GPU 容量有限,把冷一些的 KV 放到 CPU、磁盘或远端存储,可以保留更多可复用内容。LMCache 这类分层缓存系统提供了相应存储与传输能力。容量增加以后,命中路径里也多了数据准备和搬运。
对一次不可重叠的搬运,最粗的下界估算是:
其中 是实际传输字节数, 是实际有效带宽, 包括请求、注册或准备等固定成本。假设传输 96 MiB、有效带宽为 12 GiB/s,仅数据搬运项约为 7.8 ms;这个算式没有计入争用、布局转换、排队,也不是某种设备的实测速度。
收益条件应写成:省掉的计算时间,足以覆盖额外准备、搬运和由它们引起的等待。短前缀、较快的 Prefill 或拥塞的传输链路,都可能让“命中远端缓存”失去优势。
搬过来还不等于能直接用。发送与接收端需要满足模型与 KV 布局等兼容约束,必要时转换;分布式切分、精度和设备拓扑也会改变代价。把 KV 看成任意机器都能直接消费的字节文件,会漏掉这一层。
缓存保留与新请求准入争用空间
空闲的热前缀有未来复用价值,活跃请求的 KV 则是当前生成所需的状态。保留前者过多,可能挤压后者的增长空间。缓存驱逐可以先回收可丢弃的空闲块;正在使用的块不能像普通字典项一样随意删掉,必须与请求生命周期协调。
仅按最近访问时间也未必符合收益:一个频繁出现但很短的前缀,可能没有一个稍冷但很长的前缀节省得多。更完整的判断需要考虑复用概率、可省计算、占用字节和恢复成本,不过复杂策略本身也有维护与观测成本。
初始实现可以先使用简单策略,再根据逐请求记录确认是否存在明显浪费。只有某类前缀反复引起驱逐或重算时,才有依据增加策略复杂度。
用反事实拆开两个收益
怎样确认改善来自缓存,还是来自更均衡的排队?可以重放同一条到达 trace,依次使用三组配置:均衡路由且关闭缓存、均衡路由且开启缓存、同时考虑缓存与负载的路由。每组都写清初始缓存状态,记录实际复用长度和每个 worker 的队列,才有条件拆开两种收益。
如果第三组命中率更高但 P99 更差,先检查热节点排队;如果命中请求主要慢在准备阶段,检查搬运与目录失配;如果未命中请求出现重算,检查保留缓存是否挤压了活动空间。
这条排查顺序把“缓存是否有效”拆成可定位的问题。前缀缓存与 TTFT解释单请求口径,连续批处理与分页 KV解释缓存空间如何约束调度。