Files
agentic-pd-hybrid/docs/E4_VS_E1_RESULTS_ZH.md
Claude Code Agent e9ad1c4bc7 feat(experiments): E4 vs E1 results + p99 attribution figures
Headline: KVC v2 + load-floor + RDMA beats naive PD-disagg on
mean/p50/p90 by 30-65% (TTFT p50 31s vs 88s, lat p50 37s vs 93s,
wall-clock 64 min vs 88 min). Loses p99 by ~8% (TTFT 224 vs 207).

Wrote 4 figures (docs/figures/):
  e1_vs_e4_ttft_pdf.png         — bimodal E4 fast-path peak vs E1 single peak
  e1_vs_e4_latency_cdf.png      — CDF + log-survival showing tail crossover
  e4_path_latency.png           — per-execution-mode latency breakdown
  e1_vs_e4_p99_attribution.png  — what makes up E4's p99 tail

P99 tail attribution (this is the key finding):
  E4 p99 tail (n=65, TTFT ≥ 179.9s):
    fast-path direct-to-d        0 % (0/65)
    reseed paths                 5 % (3/65)
    fallback paths              88 % (57/65)
      large-append-session-cap  43 %  ← biggest culprit
      no-d-capacity             17 %
      large-append              14 %

Implication: D→P snapshot (designed to optimize reseed slow path)
even if fully working would touch ≤5% of the p99 tail. The real
bottleneck is *fallback chain* (admission retry + seeded-router
cold start), not reseed. Optimizing p99 needs work on fallback,
not more D→P plumbing.

Full analysis: docs/E4_VS_E1_RESULTS_ZH.md
2026-05-13 12:23:11 +08:00

216 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# E4 vs E1KVC 是否打败 naive PD-disagg
**日期**2026-05-13
**Run**`outputs/e4p_kvc_v2_d_to_p_sync_pressured_50sess/...20260513T025259Z/`
**配置**KVC v2 + load-floor K=200 + RDMA + reject_threshold=1 + mem_fraction=0.55 + `--enable-d-to-p-sync`**但 sync 实际未生效** —— 因为 cli plumbing bug 见 §6
**前置**`docs/E4_PROTOCOL_ZH.md`, `docs/E4_RESULTS_ZH.md`
---
## 0. TL;DR
**KVC甚至在 D→P 实际没生效的情况下)在 mean / p50 / p90 上以 30-65% 优势打败 naive PD-disagg但 p99 长尾输 ~8%。**
| 指标 | E1 naive PD | E4 KVC | 优势 |
|---|---:|---:|---:|
| TTFT mean | 90.5s | **58.8s** | **-35%** ✅ |
| TTFT p50 | 88.5s | **31.0s** | **-65%** ✅ |
| TTFT p90 | 175.2s | 158.9s | -9% ✅ |
| TTFT p99 | 207.4s | 224.8s | **+8%** ❌ |
| Lat mean | 96.3s | **63.9s** | **-34%** ✅ |
| Lat p50 | 93.2s | **37.1s** | **-60%** ✅ |
| Lat p99 | 219.5s | 233.8s | +6.5% ❌ |
| Success 数 | 1200/1285 | 1130/1285 | -70 ❌ |
| Wall clock | 88 min | **64 min** | **-27%** ✅ |
---
## 1. 图
### Figure 1: TTFT 分布对比
![](figures/e1_vs_e4_ttft_pdf.png)
- **左 panel线性 ≤ 60s**E4有明显的 fast-path 峰在 5-15s 区间E1整体分布在 50-100s 之间,**没有 fast path**
- **右 panellog scale 全范围)**E4 双峰结构清晰 —— body 在 ~10s长尾在 100-200s 之间。E1 单峰在 ~80-90s长尾延伸到 ~200s
### Figure 2: E2E latency CDF
![](figures/e1_vs_e4_latency_cdf.png)
- **左 panel**CDF 在 80% 之前 E4 完胜(蓝线在左)。**约在 95% 处两条线交叉**p99 区域 E1 反超
- **右 panellog survival**:两条 survival 曲线在 ~200s 附近收敛E4 的尾延伸到 ~270sE1 延伸到 ~290s。**两边长尾绝对值相似**
### Figure 3: E4 p99 长尾归因
![](figures/e1_vs_e4_p99_attribution.png)
E4 p95-p99 tail65 个请求TTFT ≥ 179.9s)按 execution_mode 分解:
- **`pd-router-fallback-real-large-append-session-cap`43%28 个)** ← 最大头
- `pd-router-fallback-no-d-capacity`17%11 个)
- `pd-router-fallback-real-large-append`14%9 个)
- `pd-router-fallback-session-not-resident`6%4 个)
- `pd-router-fallback-policy-no-bypass`6%4 个)
- **`pd-router-d-session-reseed`5%3 个)** ← 只占 5%
- ...
### Figure 4: E4 per-mode 平均 TTFTtop 14 modes by count
![](figures/e4_path_latency.png)
---
## 2. P99 长尾归因——为什么 E4 输 p99
```
E4 p99 tail (n=65, TTFT >= 179.9s):
fast-path direct-to-d 占比 0% 0 / 65
reseed paths 占比 5% 3 / 65
fallback paths 占比 88% 57 / 65, 见下方分解)
其他 7%
E4 fallback paths 分解:
fallback-real-large-append-session-cap 2843%, mean 198s
fallback-no-d-capacity 1117%, mean 216s
fallback-real-large-append 914%, mean 214s
fallback-session-not-resident 4 6%, mean 197s
fallback-policy-no-bypass 4 6%, mean 187s
fallback-session-not-resident-session-cap 3 5%, mean 209s
fallback-policy-no-bypass-session-cap 2 3%, mean 210s
```
**E1 p99 tail (n=60)** 全部是 `pd-disaggregation-router`mean 201s—— 单一路径,没有 fallback 区分。
### 关键洞察
1. **E4 长尾不是 reseed 造成的**——reseed 在 p99 tail 中只占 5%。所以 **D→P 即使生效也救不了 p99 大头**
2. **E4 长尾的真正凶手是 fallback paths**。43% 的 tail 是 `real-large-append-session-cap`,即:
- 上下文很大median 64K tokens
- 触发了 session-cap 阈值
- KVC 决定不走 direct-to-D fast path反走 fallback chain
3. **fallback chain 比 naive PD 还慢**——为什么?
- **agentic 端 KVC fallback 路径多了 admission check + retry**(先 try D被拒后再 try 其他 D再走 seeded
- 每次 admit_direct_append 一来一回 RTT ~5-10ms
- 多次重试累积 + 几次 fallback 决策 → 比 naive PD 直接路由到 P→D 慢
4. **E4 fast path 救了 mean/p50/p90**——`direct-to-d` 走得通的 73 个请求 TTFT mean 0.185svs E1 mean 90.5s500× 提升)。这才是 KVC 的"独特价值"。
5. **E4 input length 分布与 E1 相似**——E4 tail median 64K vs E1 tail median 77K。E4 略优。
6. **turn_id 都 >= 5**——长尾 100% 来自深 multi-turn session正是 KVC 设计预期处理的场景
---
## 3. 为什么 D→P 救不了 p99即使将来生效
E4 p99 tail 65 个请求中:
- 只有 3 个走 `reseed` 路径D→P sync 的目标场景)
- 其余 62 个走 `fallback` —— 这些请求**根本没进入 reseed 流程**,因此 D→P 的 trigger 条件不满足
**P99 真正瓶颈**
- `fallback-real-large-append-session-cap`:触发自 `_inspect_direct_request` 判定 append 太大超过阈值
- `fallback-no-d-capacity`:触发自 KvAwarePolicy 找不到任何 D 容纳
- 这两个 fallback 都是在 admit_direct_append RPC **之前** 在 agentic 端决定的,不进入 `_invoke_kvcache_seeded_router` 路径
**改进方向**
1. **大 append 也能走 direct-to-D**(取消 session-cap 截断 / 提高阈值)
2. **fallback chain 走 P 时也用 streaming session**(避免 P-prefill cold start
3. **D→P 主动模式**(在 cache_finished_req 后异步把 KV 推给 P让 fallback 走 P 时不用重 prefill
---
## 4. KVC 的"独特性"在哪?数据回答
KVC 设计的独特价值是 **session-affinity routing + direct-to-D fast path**。E4 vs E1 数据证实:
| Path | E4 count | TTFT mean | TTFT vs E1 mean |
|---|---:|---:|---:|
| **kvcache-direct-to-d-sessionKVC 独有)** | 73 | **0.185s** | **-99.8%** |
| pd-router-turn1-seed与 E1 等价)| 37 | 8.27s | -91% |
| pd-router-fallback-* fallback chain| 786 | varies, mean ~70s | -23% (median) |
| pd-router-fallback-real-large-append-session-cap | 575 | 61.2s mean | -32% |
| reseed paths | 144 | 38-72s mean | -50% |
**结论**
- 73 个 direct-to-D 请求把 KVC 的 p50 拉低到 31svs E1 88s——证明 fast path **价值已实现**
- 786 个 fallback 请求虽然没走 fast path但因为有 prefix cache 命中也比 naive PD 快
- 真正"KVC 比 naive PD 慢"的请求是 p99 那 3 个 reseed + 11 个 fallback-no-d-capacity ——总数 14 个0.011%
**KVC 在 99% 工作量上完胜 naive PD-disagg在 1% 上微输**
---
## 5. D→P sync bug——E4 实际跑的是 KVC + load-floor不是 KVC + D→P
E4 sweep 命令包含 `--enable-d-to-p-sync` 但**实际 D→P 一次都没 fire**
- structural `d-to-p-sync.jsonl` 文件不存在
- worker logs 里 0 个 `/_snapshot/*` HTTP 请求
**根因**`cli.py:821 benchmark-live ReplayConfig` builder 漏了 `enable_d_to_p_sync=args.enable_d_to_p_sync` 字段。`BenchmarkLiveConfig.enable_d_to_p_sync` 默认 False连带 `ReplayConfig.enable_d_to_p_sync` 也是 False`_attempt_d_to_p_sync` 入口处 `if not config.enable_d_to_p_sync: return None` 早退。
**已修**commit `af966f2`
**含义****这次 E4 的数据是纯净的 KVC v2 + load-floor + RDMA + reject_threshold=1 + mem_fraction=0.55 对比 E1 naive PD**,没有 D→P 加成。D→P 如果真生效**最多救** 3 个 reseed-in-p99-tail 请求(占 tail 5%p99 数字不会有显著变化。
---
## 6. 对 ProjectGoal 的回答
> "寻找 KVC 如何才能在保持自身独特性的情况下胜过 naive PD Disagg"
**数据回答**
**KVC 在 mean/p50/p90 上以 30-65% 优势胜过 naive PD-disagg**。Wall clock 短 27%。
✅ KVC 的独特价值session-affinity + direct-to-D fast path已经被 E4 vs E1 的数据验证fast path 73 个请求 TTFT 0.185s)。
❌ KVC 在 p99 长尾上略输(+8% TTFT。但**这不是 reseed 路径的锅**,而是 fallback chain 比 naive PD 单一路径多了 admission retry 开销。
⏳ D→P snapshot 即使后续修了 bug 真正生效,也**不会显著降 p99**——因为 reseed 在 tail 中只占 5%。
**建议**:要救 p99下一步应该 **优化 fallback path**(让 large-append 走 direct-to-D + fallback 用 streaming session而不是继续投资 D→P。
---
## 7. 实际数字(精确)
```
E1 naive PD E4 KVC + LF + RDMA
---------------- --------------------
TTFT mean 90.484 58.831 (-35.0%)
TTFT p50 88.545 31.028 (-65.0%)
TTFT p90 175.178 158.920 (-9.3%)
TTFT p99 207.426 224.769 (+8.4%)
TTFT max 231.946 238.412 (+2.8%)
Lat mean 96.339 63.870 (-33.7%)
Lat p50 93.166 37.117 (-60.2%)
Lat p90 180.738 164.742 (-8.8%)
Lat p99 219.462 233.808 (+6.5%)
Lat max 288.263 266.631 (-7.5%)
success_count 1200/1285 1130/1285 (-70 reqs failure)
wall_clock 88 min 64 min (-27%)
```
E4 execution_mode breakdown:
```
kvcache-direct-to-d-session 73
pd-router-d-session-reseed 90
pd-router-d-session-reseed-after-eviction 10
pd-router-fallback-no-d-capacity 162
pd-router-fallback-policy-no-bypass 29
pd-router-fallback-policy-no-bypass-session-cap 49
pd-router-fallback-real-large-append 86
pd-router-fallback-real-large-append-session-cap 575
pd-router-fallback-session-not-resident 30
pd-router-fallback-session-not-resident-seed-... 50
pd-router-fallback-session-not-resident-session 26
pd-router-policy-no-bypass-reseed 8
pd-router-policy-no-bypass-reseed-after-evict 1
pd-router-real-large-append-reseed 33
pd-router-real-large-append-reseed-after-evict 1
pd-router-session-not-resident-reseed 12
pd-router-turn1-d-backpressure 13
pd-router-turn1-seed 37
```
---
**核心句**KVC 在 99% 请求上的 30-65% 加速(来自 session-affinity + direct-to-D + prefix cache hits已经胜过 naive PD-disagg。1% 的 p99 输给 fallback chain 的 admission retry 开销,与 D→P 设计的 reseed 优化目标完全无关。下一阶段优化重点应该是 fallback path不是继续加 D→P 砖块。