跳转至

弹性、故障与跨集群

部署维度之四:副本扩缩容、抢占、故障恢复、跨集群部署在 KV 视角下的额外问题。

1. 冷启动与"热身"

新副本上线时 KV 池是空的,命中率为 0。在亲和性强的负载下,新副本拉低整体命中率:

策略 思路
预热(Pre-warming) 启动后从 L4 KV 池或对等副本拉取热门 prefix
Gradual ramp-up 路由层逐步把流量给新副本,避免冷启动期的高 TTFT
Sticky migration 老副本的部分会话主动迁移到新副本,带 KV 一起搬

工业实践里完整 pre-warming 较少,更常见的是接受短暂的命中率下降,靠路由层的 cache-aware 逐步建立缓存。

2. 缩容与 KV 处置

被踢的副本上的 KV 怎么处理:

选项 适用场景
直接丢弃 流量回退场景,重新计算成本可接受
迁移到对等副本 需要保留亲和性,副本间通过 RDMA / 网络传输
下沉到 L3/L4 长会话 / 高价值前缀,下次有副本上线时召回

迁移路径上要处理:

  • 进行中的 Sequence——drain 完成或 checkpoint 后迁移
  • prefix cache 的去重——避免迁移到已有相同前缀的副本

3. 抢占(Preemption)

KV 容量不足时,调度器必须从现有 Sequence 中"抢"一些资源:

策略 描述 代价
Swap 把目标 Sequence 的 KV 换到 CPU DRAM swap-in 延迟(μs–ms)
Recompute 丢掉 KV,下次重新 prefill prefill 延迟(s 级)
Drop 直接退请求(用户体验最差) 用户可见失败

抢占的对象选择规则:

  • 优先级(按 SLA / tenant 配额)
  • 进度(已生成更多 token 的 Sequence 重算成本更高,倾向不动)
  • 历史活跃度(短时间未活跃的 Sequence 优先 swap)

详细机制见 KV Offload 和 运行时架构。

4. 故障恢复

KV 是否需要持久化?取决于业务对会话恢复的要求:

场景 是否持久化 KV
无状态 API 否,重做 prefill 即可
长会话 Chat 视 SLA 而定,多数仍重算
长 Reasoning 推理 是,已生成的 decode 不可丢
离线批处理 是,便于断点续算

主流做法:把 KV 视为可重建的缓存——故障恢复就是重新 prefill,不专门做 KV checkpoint。少数对 reasoning 长 decode 友好的系统会做轻量持久化。

引擎进程崩溃

副本进程崩溃 → 该副本上所有 KV 丢失 → 路由器把流量切到其他副本 → 用户感知为短暂的 TTFT 抬升。

GPU 故障

GPU 卡故障是更严重的事件:

  • 模型权重需要从其他卡或盘上加载
  • KV 直接全失
  • 通常处理为副本下线 + 替换

5. 抢占 vs 弹性扩容的边界

什么时候抢占、什么时候扩容,是个调度决策:

  • 短突发:抢占 + swap,等待流量自然回落
  • 持续过载:触发扩容,新副本上线分担流量
  • 可预测峰值:定时预扩容(如商业场景的早高峰)

KVCache 视角的复杂性在于:扩容的副本要时间"热身",所以扩容决策不能等到完全过载——要预测性扩容。

6. 跨集群 / 多区域

用户会话的局部性

  • 用户通常稳定连接到最近的区域
  • 长会话的 KV 自然落在该区域,跨区域迁移很少发生

灾备与多活

  • 主备:备区域不维护 KV cache,用户切换时全部 cache miss → 重做 prefill
  • 多活:多区域同步 prefix cache(成本高,仅对热门 prefix 做)

全球前缀缓存

理想中:跨区域的统一 KV 池。 现实中:基本不做——跨区域延迟(几十 ms)+ 带宽成本远高于"本地重算"成本,得不偿失。

7. 与 SLO 的耦合

KV 弹性策略与系统 SLO 直接相关:

SLO 影响弹性策略
TTFT 严格 不能容忍 swap-in 延迟 → 倾向直接 drop / 扩容
TPOT 严格 不能容忍抢占 → 倾向多副本
吞吐第一(离线) 大量 offload + recompute 都可以
成本第一 让 KV 占满,接受偶发抢占

不同 SLO 对应不同弹性配置,没有"一套通用最优策略"。

关联章节

版本历史

版本 日期 说明
v0.1 2026-05-14 框架搭建