From 8c178a249c4c3f6fa2e719d5d31e76fe7c709ca5 Mon Sep 17 00:00:00 2001 From: iomgaa Date: Tue, 21 Jul 2026 07:22:34 -0400 Subject: [PATCH] docs: record P6 soak baseline and scoreboard artifact fixes --- research-wiki/ROADMAP.md | 2 +- .../findings/2026-07-21-p6-soak-baseline.md | 62 +++++++++++++++++++ research-wiki/findings/p6-soak-baseline.md | 11 ++++ research-wiki/graph/edges.json | 5 ++ research-wiki/index.md | 6 +- research-wiki/log.md | 2 + 6 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 research-wiki/findings/2026-07-21-p6-soak-baseline.md create mode 100644 research-wiki/findings/p6-soak-baseline.md diff --git a/research-wiki/ROADMAP.md b/research-wiki/ROADMAP.md index 71ebb97..be5801a 100644 --- a/research-wiki/ROADMAP.md +++ b/research-wiki/ROADMAP.md @@ -16,7 +16,7 @@ |---|---|---|---| | P0 奠基 | 调研、ARCHITECTURE.md、CLAUDE.md、skill Fable 5 改造、hooks 硬边界、脚手架(git/pyproject/Makefile/conda 环境/CI 绿) | — | ✅ 完成(2026-07-20) | | M1 核心 | 内核类型 + httpx transport + 治理中间件(内存后端)+ 多源多账号 + 缓存 + SQLite 遥测 + 结构化输出 + from_env | GovDoc、Video-Tree | ✅ 完成(2026-07-20;239 测试全绿、覆盖 92%、真实网关+真实 Redis 验收通过、独立 verifier 问题清零;见 designs/2026-07-20-m1-core-design.md 状态行) | -| M2 分布式 | Redis 限流/熔断后端、多源 × Redis 联合验证、背压、Postgres 遥测、成本、Embedding(Q3)、压测 harness | CHSAnalyzer(治理) | ✅ 完成(2026-07-21;契约双后端全绿 + 时间语义真实等待变体 10/10、跨连接联合验证、CHS 对标十项打钩、P3 真实验收 300 次双进程七不变量 PASS、独立 verifier 0 Critical 且 Important 清零;见 designs/2026-07-20-m2-distributed-design.md 与 findings/m2-verifier-fixes.md) | +| M2 分布式 | Redis 限流/熔断后端、多源 × Redis 联合验证、背压、Postgres 遥测、成本、Embedding(Q3)、压测 harness | CHSAnalyzer(治理) | ✅ 完成(2026-07-21;契约双后端全绿 + 时间语义真实等待变体 10/10、跨连接联合验证、CHS 对标十项打钩、P3 真实验收 300 次双进程七不变量 PASS、独立 verifier 0 Critical 且 Important 清零;见 designs/2026-07-20-m2-distributed-design.md 与 findings/m2-verifier-fixes.md。压测收官: P5 故障混编 40 次八不变量 PASS,P6 混合浸泡 8000 次全预算完成、成功率 58.1%、成本 23.42 元、熔断全周期实证,重裁全 PASS——记分板三重伪击穿口径修复见 findings/2026-07-21-p6-soak-baseline.md) | | M3 OCR | OCR 端口族 + MonkeyOCR transport | CHSAnalyzer(全量)、Video-Tree(OCR 升级) | ⬜ 未开始 | | M4 迁移验证 | 三项目逐一按 ARCHITECTURE §11 验收,缺口回补,发 v1.0 | 全部 | ⬜ 未开始 | diff --git a/research-wiki/findings/2026-07-21-p6-soak-baseline.md b/research-wiki/findings/2026-07-21-p6-soak-baseline.md new file mode 100644 index 0000000..6b48524 --- /dev/null +++ b/research-wiki/findings/2026-07-21-p6-soak-baseline.md @@ -0,0 +1,62 @@ +# P6 混合浸泡首跑基线与记分板三重伪击穿修复 + +- **日期**: 2026-07-21;**run_id**: `soak_20260721_050750` +- **结论**: 8000 次调用全部完成,库自身零缺陷;记分板两项 FAIL 均为**测量口径缺陷**(三重伪击穿),修复后离线重裁全部 PASS。修复分支 `fix/soak-scoreboard-clock`。 + +## 1. 运行参数与规模 + +| 项 | 值 | +|---|---| +| 场景 | P6 混合(P1 .10 / P2 .20 / P3 .35 / P4 .15 / P5 .20),SOAK 五源故障池 | +| 预算/实际 | 8000 次(签字帽)/ 8000 次全部完成;token 1401 万(硬顶 2 亿) | +| 拓扑 | 2 worker × 32 并发 = 64 在途;限流/熔断/缓存全 Redis(db3);Postgres 遥测 | +| 用时 | 05:07–06:54,约 1h47m(3h 上限内) | +| 成本 | **23.42 元**(价格表首次生效: 输入 2.1/输出 8.4 元/M tok;缓存命中 token=0 天然零成本) | + +## 2. 结果基线(P6 首跑,后续回归对照) + +| 指标 | 值 | 说明 | +|---|---|---| +| 总成功率 | 4648/8000 = **58.1%** | 五源池 3 坏 1 紧闸;窗口成功率从开局 40% 爬至尾段 73%(熔断学习 + 缓存变热) | +| 缓存命中 | 2373 次 | P4 复读流量生效,命中秒回零成本 | +| 延迟(成功行) | 总时长 p50/p95 = 6.8s/48.1s;TTFT p50/p95 = 22.0s/53.2s | p50 远低于 P3 纯健康池(16.9s)系缓存命中行拉低;非缓存行与 P3 同量级 | +| P3 结构化成功率(P6 内嵌) | 0.218 | 故障池 + 网关 429 高压下的口径,**不可**与纯健康池基线 0.942 直接对比 | +| RSS | 实时 ps 采样: 10min 119MB → 40min 起稳定 36MB 至结束 | 无泄漏;峰值系 harness 自身无界入队(见 §4) | + +错误分布大头(共 20146 遥测行): 网关侧 429 限速 4845(minimax_5 3773 + minimax_1 996 + minimax_4 76)、紧看门狗掐流 3622(inter_token 3390 + ttft 232)、真实空补全 2211、retry_exhausted 终态 3318、黑洞超时 230、坏 key 31。 + +**治理行为实证**: 黑洞源走完 攒失败→开路→仅探针漏过 全周期(全程 230 次超时,开路后每 5 分钟仅 1 次探针);坏 key 源 force_open 后基本从遥测消失;跑后记账归零、探针不悬挂、call_id 唯一全 PASS。 + +## 3. 三重伪击穿: RPM "FAIL" 根因链 + +记分板判 `minimax_4`(RPM=5)单分钟 6-10 次。逐层排查(每层修完仍 FAIL 才发现下一层): + +| # | 口径缺陷 | 证据 | 修复 | +|---|---|---|---| +| 1 | 用**完成时刻**(created_at=落库时刻)聚桶,调用延迟达分钟级,多个准入窗口的调用挤进同一完成分钟 | 准入时刻 = created_at − latency 重算后分布改变 | 按准入时刻聚桶 | +| 2 | 用**本机钟**聚桶,而限流器窗口 id 来自 **Redis 服务器钟**(`limiter.py:_window_id`,CHS 移植的多进程口径统一设计) | 实测 Redis 钟偏移 **+30.98s**;密集分钟 10 次准入在第 ~29 秒恰可切 5+5 | 记分时实测偏移并校正;秒级截断噪声给 ±2s 贴边豁免(邻窗有余量才可豁免) | +| 3 | **缓存命中行计入 RPM**——缓存在限流闸之前返回,未耗名额未打网关,但"遥测必录"使其带原源名落库 | minimax_4 共 579 行中 **347 行 cache_hit=1**;剔除后所有窗口 ≤5 | RPM 口径排除 cache_hit 行 | + +修复后离线重裁(`--rescore`,不产流量): **RPM PASS**。 + +## 4. RSS "FAIL" 根因: 峰值口径 + 无界入队 + +- `_rss_mb` 用 `ru_maxrss`——**历史峰值只增不减**;判"增长 782MB"实为开局峰值。 +- 峰值来源是 harness 自身: 分发循环 15 秒内把 4000 任务/worker(含 P2 ~313KB 图负载)全量 `create_task`,信号量只限执行不限入队;顺带使 `--max-hours` 截止检查随分发结束而失效、执行期无进度打印。 +- 库无泄漏: 运行期实时 ps 采样 36MB 稳定 90 分钟(本 finding §2)。 + +**修复**: ① `_rss_mb` 改 `ps -o rss=` 当前值;② 分发改 `_paced_dispatch` 有界模式(先占并发名额再建任务),截止检查全程有效、内存峰值受限、进度行全程可见;③ 旧格式结果(仅峰值序列)重裁时判 SKIP 不判 FAIL。 + +## 5. 交付物 + +- `tools/soak/scoreboard.py`: `inv_rpm_never_exceeded` 新口径(准入时刻 + 服务器钟偏移 + 贴边豁免 + 排除缓存行)。 +- `tools/soak/run_soak.py`: `_rss_mb` 当前值、`_paced_dispatch` 有界分发、`_redis_clock_offset_s`、`--rescore RUN_ID` 离线重裁模式。 +- 测试: `tests/unit/test_soak_corpus.py` 新增 6 用例(先红后绿),全套 356 过 0 败覆盖 90%。 +- 重裁报告: `tests/outputs/soak/soak_20260721_050750.md`(全 PASS/SKIP)。 + +## 6. 经验沉淀 + +1. **不变量的口径必须与执法者同源**: 限流器用什么时钟、在哪个时刻、对哪些流量执法,记分板就必须用同样的三元组重算;任何一元错位都产生伪击穿。 +2. 分布式系统验收前先测**时钟偏移**(本实验室 Redis 快 ~31s)。 +3. `ru_maxrss` 不可用于"平稳性"断言;峰值与当前值是两个量。 +4. "遥测必录"(含缓存命中)与"限流口径"(仅真实过闸流量)是两个集合,消费遥测时必须显式选择。 diff --git a/research-wiki/findings/p6-soak-baseline.md b/research-wiki/findings/p6-soak-baseline.md new file mode 100644 index 0000000..c1decd6 --- /dev/null +++ b/research-wiki/findings/p6-soak-baseline.md @@ -0,0 +1,11 @@ +--- +type: finding +node_id: finding:p6-soak-baseline +title: "P6 混合浸泡首跑基线与记分板三重伪击穿修复" +date: 2026-07-21 +--- + +# P6 混合浸泡首跑基线与记分板三重伪击穿修复 + +> 正文见 [2026-07-21-p6-soak-baseline.md](2026-07-21-p6-soak-baseline.md);结论: 8000 次全预算完成、库零缺陷,两项 FAIL 均为记分板口径伪击穿(完成时刻聚桶/本机钟 vs Redis 钟偏移 31s/缓存行计入 RPM + ru_maxrss 峰值),修复后重裁全 PASS。 + diff --git a/research-wiki/graph/edges.json b/research-wiki/graph/edges.json index 4442a5c..508cb91 100644 --- a/research-wiki/graph/edges.json +++ b/research-wiki/graph/edges.json @@ -35,6 +35,11 @@ "id": "finding:m2-verifier-fixes", "label": "M2 verifier 三项 Important 补齐(不变量接线/网关保护/P3 验收)", "type": "finding" + }, + { + "id": "finding:p6-soak-baseline", + "label": "P6 混合浸泡首跑基线与记分板三重伪击穿修复", + "type": "finding" } ], "links": [ diff --git a/research-wiki/index.md b/research-wiki/index.md index 5d84a62..e8e6c32 100644 --- a/research-wiki/index.md +++ b/research-wiki/index.md @@ -1,6 +1,6 @@ # Research Wiki 索引 -> 自动生成,更新时间:2026-07-21 06:00 UTC +> 自动生成,更新时间:2026-07-21 11:19 UTC ## design (4) - [2026-07-20-m1-core-design](designs/2026-07-20-m1-core-design.md) `design:2026-07-20-m1-core-design` @@ -8,10 +8,12 @@ - [M1 核心里程碑设计:公共签名冻结与治理栈落地](designs/m1-core-design.md) `design:m1-core-design` - [M2 分布式:Redis 治理后端+背压+Postgres 遥测+pricing+Embedding+压测 harness](designs/m2-distributed.md) `design:m2-distributed` -## finding (3) +## finding (5) - [2026-07-20-m2-soak-workload](findings/2026-07-20-m2-soak-workload.md) `finding:2026-07-20-m2-soak-workload` +- [2026-07-21-p6-soak-baseline](findings/2026-07-21-p6-soak-baseline.md) `finding:2026-07-21-p6-soak-baseline` - [M2 verifier 三项 Important 补齐(不变量接线/网关保护/P3 验收)](findings/m2-verifier-fixes.md) `finding:m2-verifier-fixes` - [M2 真实数据压测: 场景矩阵与数据清单](findings/m2-soak-workload.md) `finding:m2-soak-workload` +- [P6 混合浸泡首跑基线与记分板三重伪击穿修复](findings/p6-soak-baseline.md) `finding:p6-soak-baseline` ## plan (4) - [2026-07-20-m1-core-plan](plans/2026-07-20-m1-core-plan.md) `plan:2026-07-20-m1-core-plan` diff --git a/research-wiki/log.md b/research-wiki/log.md index 568e47e..4b92fba 100644 --- a/research-wiki/log.md +++ b/research-wiki/log.md @@ -19,3 +19,5 @@ - [2026-07-21 03:46 UTC] 重建索引: 12 篇页面 - [2026-07-21 06:00 UTC] 新增 finding: M2 verifier 三项 Important 补齐(不变量接线/网关保护/P3 验收) (finding:m2-verifier-fixes) - [2026-07-21 06:00 UTC] 重建索引: 13 篇页面 +- [2026-07-21 11:19 UTC] 新增 finding: P6 混合浸泡首跑基线与记分板三重伪击穿修复 (finding:p6-soak-baseline) +- [2026-07-21 11:19 UTC] 重建索引: 15 篇页面