docs(kvc): freeze reseed slow-path audit + three reviewer challenges

Standalone reference document capturing the v2 reseed slow-path forensic
audit before opening the feat/d-to-p-sync branch. Designed to be quoted
directly by future paper drafts and to prevent the team from re-relitigating
the same questions verbally.

Contents:

§1. The three team-member challenges that disproved "capacity-backup will
    save the slow path" (each with code citation and verdict):
    1) P pool can't fit all backups -- replay.py:1618-1620 caps backup
       count at 1 for sessions with ~50K peak input.
    2) P's backup is a stale snapshot -- 49K of direct-to-D append work
       never flows through P. _commit_prefill_backup_residency
       (replay.py:1483) is only called from seed/reseed paths;
       direct-to-D path (replay.py:2719) never touches P-side state.
    3) When D evicts, old KV is freed directly (no D->P dump).
       session_aware_cache.release_session only calls
       kv_pool_allocator.free().

§2. End-to-end reseed timeline (t=0 to t=4550ms) with code citations
    showing exactly where each component sits. P-side re-prefill =
    1.5-3s, mooncake transfer = 1.5-4s, both contributing 50/50 to
    total reseed cost.

§3. Table of "looks like D->P but isn't" code locations -- every
    candidate found during forensic search ruled out with line citations.

§4. Specification of what D->P incremental sync would require:
    mooncake bidirectional roles (~400 LOC), D-side append commit hook
    (easy), P-side radix tree multi-producer extension (the real blocker),
    agentic-pd-hybrid replay.py hooks. Estimated 1-2 weeks engineering.

§5. Confirmation via `git ls-remote origin --refs` that author has NOT
    secretly implemented D->P on another branch -- only main + this
    working branch exist on the server.

§6. Roadmap for the upcoming feat/d-to-p-sync branch.

Appendices: code position crosswalk, related commits, paper section
suggestions.

This document is referenced by V2_DEEP_ANALYSIS_ZH §4.2 and by
KVC_ROUTER_ALGORITHM §9 Open Question 4.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
kzlin
2026-05-11 22:20:34 +08:00
parent 9ccd853066
commit c01d6101d6

View File

@@ -0,0 +1,368 @@
# Reseed 慢路径现状与 D→P KV 同步缺口
**日期**2026-05-11
**对象**:项目团队 + 后续 paper reviewer
**性质**:基线现状落盘 + future-work 缺口定位
**前置文档**
- `docs/V2_DEEP_ANALYSIS_ZH.md` §3.2 §4.2reseed 路径在 v2 数据中的表现)
- `docs/KVC_ROUTER_ALGORITHM.md` §3 §9算法形式化 + open questions
**目的**:把"v2 的 reseed slow path 为什么慢、能不能用现有机制治、还差什么"三个问题落盘成单一参考文档,让团队不必再口头反复对齐,让论文 future-work 章节有可引用的基础。
---
## 0. TL;DR
1. KVC v2 在 SWE-Bench 测试中 8.3% 请求走非 direct-to-D 的 reseed/fallback 路径,**单次 reseed 实测 3-7s**TTFT p99 = 1.28s 全部来自这条路径)。
2. 启用真 RDMA节点有 mlx5_0/_1 @ 200 Gb/s × 2 active能把 reseed 的 transfer 段(~1.5-4s压到 ~200-400ms但**对 re-prefill 段(~1.5-3s无效**。预期 reseed 总时间从 3-7s 降到 1.7-3.2sTTFT p99 ~0.7s**仍输 DP0.43s**。
3. 真正消除 reseed 长尾必须实现 **D→P 增量 KV 同步**——让 P 端 backup 跟上 D 在 direct-to-D append 路径上累积的 KV避免 reseed 时重新跑 prefill kernel。
4. 经 Opus agent 独立 forensic 审查commit `9ccd853`+ 全分支 git 检索:**当前代码、vendored SGLang、mooncake 三层均无 D→P 实现**,作者也没有在其它分支偷偷开发——仓库总共只有 main旧 baseline+ kvc-debug-journey-v1-to-v4本工作分支两个分支main 还落后我们 18 个 commit。
5. `--kvcache-prefill-backup-policy capacity-backup` 这个 flag 看起来像 D→P 同步但**不是**——它的真实语义只是"reseed 完不关 P streaming session"P 端 KV 仍是 seed-time 的**静态快照**,不随 direct-to-D append 而增长。
6. 实现 D→P 增量同步的工程量 ~1-2 周最难的不是网络层mooncake 加 D-sender / P-receiver 角色 ~400 LOC而是 **SGLang radix tree 改成允许从外部 worker 喂数据**——radix cache 当前假设单一生产者。
---
## 1. 团队成员的三个质疑关键框架paper 引用建议保留原话)
这三条质疑出自 v2 完成后的对话审查,**直接戳穿了"启用 capacity-backup 就能消除 slow path"的一厢情愿**。每条都有代码层证据支持,**全部成立**。
### 质疑一P 节点的 pool 塞得下所有 backup 的 KV cache 吗?
**回答塞不下max 同时 backup ~1-2 个大 session。**
代码证据(`src/agentic_pd_hybrid/replay.py:1618-1620`
```python
max_backup_sessions = max(1, capacity_tokens // max(1, target_tokens * 2))
max_backup_sessions = min(max_backup_sessions, 4)
```
按 SWE workload 实测代入:
- P 池 `capacity_tokens` ≈ 92,104 tokensSGLang 启动时按 mem_fraction_static 自动分配)
- 典型 session peak input `target_tokens` ≈ 50,000-80,000 tokens
- 计算:`92K // (50K × 2) = 0``max(1, 0) = 1`
-**P 最多同时 backup 1 个大 session**
对照小 session
- target 20K`92K // 40K = 2` → backup 上限 2 个
- target 10K`92K // 20K = 4` → backup 上限 4 个(达到代码硬上限)
**capacity-backup 在真实 agentic 长 context workload 下只能救少数 session不是全员保险。**
### 质疑二P 上的 backup 是陈旧快照——49K 的 append 内容根本没经过 P
**回答:完全正确,这是 capacity-backup 设计上的致命缺陷。**
**用户提供的反例场景**(已成为 paper 中描述 slow path 的标准例子):
```
turn 0: P 做 prefill 1K tokens → 经 mooncake 传到 D → P 留 1K backup
turn 1-50: 全部走 direct-to-DD 上做 append-prefillKV 在 D 上从 1K 增长到 50K
↑↑↑ 关键:这 49K 的 append 内容tool 输出、user 消息、模型生成)
**从未流经 P 节点**。P 端 backup 锁在 1K 状态。
turn 51: D 出于某种原因(容量、迁移、显式驱逐)拒绝 → 触发 reseed
→ 即使 P 上有 backup也只是 turn-0 的 1K
→ 实际需要 D 上重建的是 50K当前完整 context
→ P 必须从 prompt 重新 prefill 49K 的差额
→ capacity-backup 节省的 compute 仅 ~2%
```
**代码证据**(独立 Opus agent forensic 审查commit `9ccd853`
1. 唯一更新 `session.prefill_resident_tokens` 的函数是 `_commit_prefill_backup_residency``replay.py:1483`
2. 这个函数的唯一 caller 是 `_invoke_kvcache_seeded_router``replay.py:2208`)—— 即 seed/reseed 路径
3. `_invoke_session_direct``replay.py:2719`direct-to-D 路径)只更新 `session.opened` / `resident_tokens` / `last_trace_request`**从不触碰任何 P 端字段**
4. `_commit_prefill_backup_residency` 内部用 `_estimate_session_resident_tokens(request)` 取的是**完整 request 的预估**,不是 append delta——所以连 bookkeeping 层面都不假设有增量更新
**`capacity-backup` 的真实语义只是"reseed 完之后跳过 `_close_prefill_session`"**`replay.py:2221`P 端 streaming session 保持 open 状态、KV 留在 P 的 radix tree 中。但**不存在任何机制让这份 KV 跟上 D 端的 append 增长**。
### 质疑三D 触发 reseed 后,本机旧 session 的 KV cache 是不是清空了P 做完 re-prefillKV 推到哪里?
**回答:是的,旧 KV 直接 free 掉P 重新 prefill 完之后推到 router 选的新 target D可能同 D可能换 D。中间没有"先 dump 到 P 再清"的快捷方式。**
#### D 端驱逐时的 KV 处理
代码证据(`replay.py:_close_decode_session`1539-1569 行;`session_aware_cache.py:release_session`250-276 行):
```python
# replay.py 端
async def _close_decode_session(..., evicting_for_capacity=False):
if not session.opened:
return
await _close_streaming_session(...) # 给 D 发关闭信号
# 从 D 的 resident bookkeeping 里删掉这个 session
session.opened = False
session.resident_tokens = 0
if evicting_for_capacity and not session.prefill_opened:
residency.decode_evictions_without_prefill_backup += 1
# SGLang 端session_aware_cache.py
def release_session(self, session_id):
# 解锁引用 + 直接 free KV slots
self.token_to_kv_pool_allocator.free(kv_indices)
# ↑ 没有序列化、没有外发、没有 D→P 通道
```
**D 驱逐 = 把 KV slot 直接归还给 token pool 分配器。完全没有任何 outbound 网络调用。**
#### Reseed 时 P→D 的目标选择
驱逐之后的 reseed 路径(`_invoke_kvcache_seeded_router``replay.py:2101`)走的是与 turn 0 完全一样的 P-mediated seeding
```
1. KvAwarePolicy.select() 选择一个 target D'(可能是同一个 D也可能因 migration 换 D
2. _invoke_kvcache_seeded_router 在 D' 上 open 一个 streaming session
3. 给 P 发完整 prompt → SGLang pd-router 让 P 做完整 prefill
4. P 的 prefill 完成后通过 mooncake 把 KV 一次性推到 D'
5. D' 上接收完毕session 重建完成decode 继续
```
**所以 P 做完 re-prefill 的 KV 推到 KvAwarePolicy 选的 target D'**——可能是:
- 同一个 D驱逐后重新接受
- 另一个 D如果 reject 计数累积触发 migration详见 KVC_ROUTER_ALGORITHM §3.3
无论哪种,**旧 D 的旧 KV 在新 KV 到达之前就已经被 free**。没有 D→D 的直接迁移路径,没有"先 dump 到 P 再推回"的快捷路径。
---
## 2. Reseed 路径的完整 step-by-step 现状
把上面三个质疑串成端到端流程,以下是 v2 当前 reseed 路径的**完整**操作序列。每一步都标注实测耗时与代码位置。
### 触发条件
下列任一发生时 router 走 reseed 路径(详见 `KVC_ROUTER_ALGORITHM.md §3.3`
- D 端 `Admit()` 返回 `can_admit=False`,原因为 `no-d-capacity` / `session-not-resident` / 等
- KvAwarePolicy.select 返回的 D 不再持有该 sessionmigration 触发)
- v1/v2 的 reject counter 累积让所有 D 都被 blacklist极少触发由 reset-on-success 保护)
### 端到端时间线
```
t=0 上游 agent 发出 turn N 请求input ~50Kappend ~2K
t=~5ms Router 的 KvAwarePolicy.select() 选 target D'O(|D|) Python 评分)
t=~10ms Router → D' 发 admit_direct_append RPC
t=~30ms D' 返回 can_admit=False, reason="session-not-resident"
或 "no-d-capacity"Algorithm 3 bump rejects[s, D']++
fallback chain 最多再试 ε-1 个 D对应 ε ~30ms 总额)
t=~100ms 所有 D 都被拒 / 选不到适合 D路径退化到 seeded router
t=~110ms Router 转 _invoke_kvcache_seeded_router
t=~120ms [可选] capacity-backup policy 下_reserve_prefill_backup_capacity()
检查 P 池容量,若不够先 LRU 驱逐别的 P backup session
t=~150ms P 上 open streaming sessionHTTP /session/open
t=~200ms 发完整 prompt 到 SGLang pd-router → 路由到 P
t=~250ms P 开始 prefill
↓ ←←← 大头 1P-side re-prefill 段
↓ P 必须 prefill 完整 ~50K tokens
↓ 即使 capacity-backup 开着P 的 backup 只有 turn-0 的 ~1K
↓ radix prefix cache 命中前 1K剩余 49K 重算
↓ 实测耗时:~1.5-3s @ Qwen3-30B TP1
t=~2000ms P 完成 prefillKV 进入 mooncake transfer 队列
t=~2050ms mooncake 开始 P→D' transfer
↓ ←←← 大头 2P→D mooncake transfer 段
↓ KV 张量 ~5-9 GB50K tokens × 2 bytes/token × layers × heads...
↓ **TCP loopback** 实测耗时:~1.5-4s
↓ ↑↑↑ 当前 sweep 未启用 RDMA走的是单机 lo 设备
↓ 若启用 IB RDMA @ 200 Gb/s理论 200-400ms
t=~4500ms transfer 完成D' 上 session 重建好
t=~4510ms D' 开始 decode小幅度 append-prefill 余下的 ~2K append + 生成)
t=~4550ms 首个 token 出来 → TTFT 测点
```
**单次 reseed 总耗时3-7s**(中位 ~2.5s 来自较小 sessionp99 ~7.7s 来自最大 session。**re-prefill 段与 transfer 段大致五五开**,受 session 大小影响。
### 这就是为什么 v2 的 TTFT p99 = 1.28s
8.3% slow path 走的是上面这条流水线,其中 reseed 路径(`pd-router-d-session-reseed`)单独占 3.4%150/4449 请求),构成 KVC TTFT p99 长尾的主要贡献。
---
## 3. 已审查的所有"看起来像 D→P 但其实不是"的代码
下面这些在搜索时容易误判成 D→P 实现,**全部经独立 audit 排除**
| 文件:行 | 看起来像 | 实际是 |
|---|---|---|
| `replay.py:1483 _commit_prefill_backup_residency` | "把 backup 提交到 P" | bookkeeping 函数,更新 `session.prefill_resident_tokens` 计数字段。不传输任何 KV 数据,只在 seed/reseed 完成后被调用。 |
| `replay.py:1572 _reserve_prefill_backup_capacity` | "预留 backup 空间" | 检查 P 池可用空间并按 LRU 驱逐别的 backup session 腾位置。不传 KV只调整 reservation 计数。 |
| `cli.py:182 --kvcache-prefill-backup-policy` | "backup 策略" | 只决定 reseed 完成后是否 `_close_prefill_session`。capacity-backup = 保留 P 端 streaming session 不关release-after-transfer = 立刻关闭。**两种策略下 P 的 KV 都是 seed-time 的静态快照**。 |
| `session_aware_cache.py:release_session` | "释放 session可能含外发" | 仅调 `kv_pool_allocator.free(kv_indices)`。零网络调用。 |
| `disaggregation/decode.py: start_decode_thread` | "decode 端线程,可能有出站" | 纯 receiver loop。处理入站 `AUX_DATA / CHUNK_READY / STAGING_REQ / KVPoll.Success`**没有出站 KV 传输分支**。 |
| `disaggregation/mooncake/conn.py:1563` | "传输请求添加" | `assert disaggregation_mode == PREFILL`——硬约束,只有 P 端能调。 |
| `mooncake.MooncakeKVSender` / `MooncakeKVReceiver` | "双向 sender / receiver" | 强角色化Sender 只在 PREFILL 模式实例化Receiver 只在 DECODE 模式。`BaseKVManager` 抽象无 bidirectional slot。 |
| `pd-router-d-session-reseed-after-eviction` execution_mode | "走 backup 的快路径" | 实际还是走完整 `_invoke_kvcache_seeded_router`P 完整 prefill + 完整 mooncake transfer只是 `_eviction_suffix()` 在 execution_mode 字符串末尾加了 "-after-prefill-backed-eviction" 标签。**没有任何 fast-path 优化**。v2 中仅 2/4449 请求走到这个标签。 |
---
## 4. D→P 增量同步:要做的是什么
完整 D→P 增量同步的设计目标:**让 P 端的 backup KV 在 direct-to-D append 完成后异步追上 D 端的 KV让 reseed 退化为单次 P→D transfer无需 P re-prefill**。
### 抽象数据流
```
当前:
direct-to-D append: D 本地 append-prefillP 端 backup 锁住不变
reseed: P re-prefill 完整 50K + P→D transfer 完整 50K
目标:
direct-to-D append: D 本地 append-prefill**同时**异步把新增的 KV 块推回 P
reseed: P→D' transfer 完整 50K (already up-to-date)
无需 P re-prefill
```
### 实现层面要改的事
按工程难度排序:
#### 4.1 Mooncake 双角色化(中等难度,~400 LOC
- `BaseKVSender` / `BaseKVReceiver` 抽象保留,但允许同一 worker 同时实例化两种角色
- `MooncakeKVManager.__init__` 把 PREFILL / DECODE 分支改成"role set",允许 worker 同时持有 sender 和 receiver
- 新增 `DecodeKVSender`D 端用于把 append KV 推回 P
- 新增 `PrefillKVReceiver`P 端用于接收 D 的 append KV
- 引入第二个 bootstrap channel避免与原 P→D 通道在 buffer pointer 协商上冲突)
#### 4.2 D 端 append commit hook容易
- 每次 `direct-to-D-session` 完成后,识别新写入的 KV 块D scheduler 在 commit 时知道)
- 入队 D→P 传输(异步,不阻塞 next request
- 标记 backup 是否成功送达 P用于后续 reseed 决策)
#### 4.3 P 端 radix tree 多生产者扩展(**最难,工程量主体**
**这是真正的架构 blocker**。SGLang 的 P 端 radix cache 当前假设:
- 单一生产者(本 worker 的 model 输出)
- 树插入只在 prefill / decode 完成时发生
- KV 索引由本 worker 的 token_to_kv_pool_allocator 分配
要让 P 接收 D 喂来的 KV 块,需要:
- 扩展 radix tree 节点的写入路径,允许"外部供给的 KV + token 序列"被插入
- 处理 KV 索引重映射D 的 slot 号在 P 上无意义)
- 处理 reference counting同一 session 可能既被本 worker 用、又被 D 喂回更新)
- 处理 eviction policy 协调P 端 radix LRU 不应让"被 D 喂入的 backup"先被驱逐)
- 处理 KV 数据格式的跨 worker 兼容(同样的 model layout应该是 trivial但需要测试
#### 4.4 agentic-pd-hybrid 端 hook容易
- `_invoke_session_direct` 完成后,新增一步:触发 D→P 同步 RPC异步
- `_invoke_kvcache_seeded_router` 在 reseed 触发前先 probe P 是否有 up-to-date backup若有跳过 re-prefill只做 P→D transfer
- 新增 CLI flag `--enable-d-to-p-sync`,默认 off保留 baseline 行为
- 新增 structural log channel 记录 D→P 同步事件 / 失败 / 延迟
### 实现完毕后的预期收益
| 指标 | 当前 (v2) | RDMA only | RDMA + D→P sync |
|---|---:|---:|---:|
| reseed re-prefill 段 | 1.5-3s | 1.5-3s不变 | **~0**(已有 up-to-date backup |
| reseed transfer 段 | 1.5-4s | 0.2-0.4s | 0.2-0.4s |
| reseed 总耗时 | 3-7s | 1.7-3.4s | **0.2-0.4s** |
| TTFT p99 | 1.285s | ~0.7s | **~0.4-0.5s**(与 DP 接近或胜过) |
| 8.4% slow path 占比 | 不变 | 不变 | 可能保持但单次代价大幅下降 |
→ 这就是 paper 里 future-work 应当声明的**"完整版 KVC 才能真正在 TTFT 全分位数上击败 DP"** 的路径。
---
## 5. 仓库分支审查(确认无作者私下实现)
`git ls-remote origin --refs` 完整结果:
```
9ccd853... refs/heads/kvc-debug-journey-v1-to-v4 ← 本工作分支(含本文档)
e9062b1... refs/heads/main ← baseline落后我们 18 commit
```
- **服务器只有 2 个分支****0 个 tag****0 个隐藏 ref**
- main 是更老的 baseline`_commit_prefill_backup_residency` 等同名函数,但语义与本工作分支一致——都是静态 backup无 D→P 同步
- 全 git 历史搜索 `D->P / d-to-p / decode.*prefill.*transfer / kv.*pushback / kv.*sync / incremental / mirror` 关键词,**唯一命中是 commit `9ccd853`**(本文档相关的 doc 改动)
- 唯一 remote 是 `origin``git@ipads.se.sjtu.edu.cn:wangjh/agentic-pd-hybrid.git`),无 upstream / fork
**作者没有在其它分支偷偷实现 D→P**。这块工作是真空。
---
## 6. 下一步
按 ROI 排序:
### 必做(落地下一阶段)
1. **新开 `feat/d-to-p-sync` 分支** 从当前 `kvc-debug-journey-v1-to-v4` 起步
2. 写设计文档 `docs/D_TO_P_SYNC_DESIGN_ZH.md`
- 包括上面 §4 的实现细节
- 添加 sequence diagramP/D 通信时序)
- 评估 SGLang radix tree 多生产者扩展的具体 API 改动
- 评估 D→P 同步对 direct-to-D fast path 自身延迟的影响(理想是异步零开销)
3. POC 阶段 1mooncake 双角色化 + 一个能跑通的 D→P transfer 单测
4. POC 阶段 2P 端 radix tree 多生产者扩展(重点工程量)
5. POC 阶段 3agentic-pd-hybrid 端的 hook + flag
6. 端到端验证:跑同 trace 同 ts=1 配置,目标 TTFT p99 < 0.5s
### 推荐
7. **同时启用真 RDMA**独立于 DP 工作只需改 sweep 脚本加 `--force-rdma --ib-device mlx5_0`先把现有 transfer 段加速作为 baseline
8. **跑 RDMA-only 对照**先证明单 RDMA 启用能把 TTFT p99 1.28s 压到 ~0.7s再用 DP sync 把剩下的 re-prefill 段也吃掉这样 paper 里能写两条独立的 ablation
### 不要做的事
- main / 工作分支上做 DP 实验隔离开主分支应该保持 v2 稳定
- 试图通过 capacity-backup 现有 flag "调出"DP 效果——它结构上做不到
---
## 附录 A本文档涉及的代码位置
| 函数 / 字段 | 位置 |
|---|---|
| `_commit_prefill_backup_residency` | `src/agentic_pd_hybrid/replay.py:1483` |
| `_reserve_prefill_backup_capacity` | `src/agentic_pd_hybrid/replay.py:1572` |
| `_close_prefill_session` | `src/agentic_pd_hybrid/replay.py:1507` |
| `_close_decode_session` | `src/agentic_pd_hybrid/replay.py:1539` |
| `_invoke_session_direct` (direct-to-D 路径) | `src/agentic_pd_hybrid/replay.py:2719` |
| `_invoke_decode_session_direct` | `src/agentic_pd_hybrid/replay.py:2826` |
| `_invoke_kvcache_seeded_router` (reseed 路径) | `src/agentic_pd_hybrid/replay.py:2101` |
| `DirectSessionState.prefill_resident_tokens` | `src/agentic_pd_hybrid/replay.py:128` |
| `_eviction_suffix` | `src/agentic_pd_hybrid/replay.py:1220` |
| `--kvcache-prefill-backup-policy` CLI flag | `src/agentic_pd_hybrid/cli.py:182-189, 436-441` |
| `MooncakeKVManager.__init__` | `third_party/sglang/python/sglang/srt/disaggregation/mooncake/conn.py:187-256` |
| `start_decode_thread` (decode receive loop) | `third_party/sglang/python/sglang/srt/disaggregation/mooncake/conn.py:1425-1496` |
| `add_transfer_request` (assert PREFILL) | `third_party/sglang/python/sglang/srt/disaggregation/mooncake/conn.py:1563` |
| `MooncakeKVSender` / `MooncakeKVReceiver` | `third_party/sglang/python/sglang/srt/disaggregation/mooncake/conn.py:1648, 1740` |
| `BaseKVSender` / `BaseKVReceiver` 抽象 | `third_party/sglang/python/sglang/srt/disaggregation/base/conn.py` |
| `session_aware_cache.release_session` | `third_party/sglang/python/sglang/srt/mem_cache/session_aware_cache.py:250-276` |
| `session_controller._close` | `third_party/sglang/python/sglang/srt/managers/session_controller.py:293-316` |
## 附录 B相关 commit
| Commit | 内容 |
|---|---|
| `9ccd853` | docs: DP 缺口的 Opus forensic audit 写入 V2_DEEP_ANALYSIS §4.2 + KVC_ROUTER_ALGORITHM §9 |
| `2ec0deb` | v2 实现reset-on-success + threshold 20488192)—— 直接 trigger 了对 reseed 慢路径的关注 |
| `c47adaf` | feat: backpressure pause hint reseed 不直接相关但展示了"D 端可主动告知 router"的通信通道存在是未来 DP sync 控制平面的潜在基础 |
## 附录 C相关 paper 章节建议
- **§Background** §1-§2 reseed 现状作为 motivation 摆出
- **§Algorithm**参考 `KVC_ROUTER_ALGORITHM.md` Algorithm 1-3
- **§Evaluation §Slow Path Cost** §2 的端到端时间线作为 Figuresequence diagram
- **§Future Work / Limitations**把本文 §4 作为 KVC 真正实现"完整 fast path 替代" roadmap引用 DP 工作的设计文档后续 `feat/d-to-p-sync` 分支产物
---
**核心句**v2 实现的 KVC 91.6% 请求上证明了 session-affinity 路由的价值 8.3% reseed 慢路径让 TTFT p99 DP 3×。这条慢路径的 50% 时间在 P re-prefill50% mooncake transfer——RDMA 只能救后者**DP 增量 KV 同步是唯一能消除 re-prefill 的机制**且当前在框架SGLangmooncake 三层都没有实现需要新建 `feat/d-to-p-sync` 分支从设计文档开始