6.10 共享块、写时复制与缓存淘汰的状态账本
KV 块分配、分页寻址与前缀复用
完整且不再写入的前缀块可以只读共享;分支在一个未满的共享尾块追加时,若后端允许共享这种尾块,就先复制已有有效槽位,再修改该分支的 Block Table。只增加 ref_count 而不处理写入隔离,会让一个请求覆盖另一个请求的 KV。
A、B 共用物理块 p,ref_count=2
A 要修改 p → 分配 p′ → 复制有效 KV → A 的表改指 p′
原 p 的引用减为 1;B 继续只读 p
引用数为零与数据立即销毁是两件事:缓存块可以没有活跃请求引用,仍保留哈希用于后续命中。分配器重用该块前必须移除旧索引 / generation,避免旧 key 指向已覆盖数据。LRU 淘汰只能选可回收块,不能驱逐活跃引用却不通知请求。
块账本要定义互斥分类:一些实现把“可淘汰缓存块”也放在 free queue,不可再把 cached 与 free 相加。核对每个物理 ID 只计算一次、引用数非负、共享写入隔离、释放不重复。Prefix Cache 的收益主要来自少算 Prefill;它不会把每步历史 Attention 读取消除。
实验:固定相同前缀、只变后续问题,测冷 / 热 TTFT、命中 token 数、缓存占用;再用相同词但不同顺序的前缀确认不会误命中。缓存 key 同时考虑模型、Adapter、位置与多模态内容,不能只比较文本。vLLM Prefix Cache 设计