Skip to content

[perf stack continuation 7] 内联解压后复用已校验 metadata,省去重复解析和分配 - #640

Merged
SunSi12138 merged 19 commits into
devfrom
perf/stack4-07-metadata-reuse-20260909
Sep 9, 2026
Merged

SunSi12138 merged 19 commits into
devfrom
perf/stack4-07-metadata-reuse-20260909

Conversation

@SunSi12138

Copy link
Copy Markdown
Owner

堆叠位置

接在 #639 后,审查顺序为 #633 → #634 → #635 → #636 → #638 → #639 → 本 PR。固定父提交 71004591d9b7764abba2dde67bdbf66d0682d713,不修改 #605、dev/main 或此前分支,不自动合并。仅包含已认可的 metadata 复用候选,没有加入普通 Span 解包或持久异步解码实验。

改动与所有权

内联压缩 Unary/Oneway 原来在解压前后各解析一次相同 envelope,重复创建 metadata。新增 ReadDecoded:首次严格解析照常完成;仅在协商了 Metadata、HasMetadata 存在、前后完整前缀连续且逐字节相同、metadata 长度仍满足当前限额时,复用首次不可变 metadata 和精确 RpcDeadline,把 Arguments 重新绑定到 decoded 存储。

前缀变化、截断、跨段、能力或限额不满足均回退原解析器。保留第一次验证、解压检查、准入、协议限额和错误语义。比较/重新绑定先于 retained encoded owner.Dispose 与 decode permit.CompleteDecode,确保两个输入所有者仍然有效。持久异步解码路径不改,禁止借序列视图跨 await 延长其输入生命周期。

前一轮组件证据,不是新的 TCP 成绩

相同 probe、Client/Runtime/Abstractions,只替换 Server;SDK 10.0.400/runtime 10.0.11,Release,默认分层 JIT,一个 ABBA。包含首次解析和第二次解析/复用,不包含实际解压、业务、发送或网络。

两阶段解包 原实现 候选 耗时变化 分配
无 metadata 控制 99.05 ns 104.13 ns +5.12% 0 → 0 B
1 条 metadata 252.89 ns 180.18 ns −28.75% 304 → 152 B
8 条 metadata 745.55 ns 454.26 ns −39.07% 1760 → 880 B

无 metadata 控制两边都调用原 Read、不进入新复用方法,但约 5.12% 的实测回退仍保留;不能证明只是 JIT/布局/噪声,也不能声称全场景非劣。省掉第二份 metadata 并非整个 RPC 分配减半,更不能从普通 Unary 的 B/RPC 减掉 880 B。这是当前严格实现的增量证据;重大热路径仍以 v1.1.1 端到端对照为主。

本次提交验证

三个生产文件 SHA256 与前一轮实际受测候选完全一致。新增仓库 DecodedRequestMetadataReuseTests,将原独立 2,924 案例差分语料纳入 TUnit,并补充未协商 Metadata 的回退测试。覆盖截断、所有切分位置、逐字节前缀改写、当前限额收紧、引用复用、原 deadline 保留、decoded 参数别名。

本地小型 TUnit 宿主编译同一仓库测试源:13 项现有 envelope 用例+2 项新增用例,15/15 两次通过,未跳过用例。最后一次 Release 构建 0 警告/0 错误。2,924 是单个测试内部的语料检查数,不是测试实例数;初次测试宿主缺 namespace import 的编译失败已保留,修正导入后通过,没有修改生产补丁或放宽超时。

发布 Actions #34352258565 只核对 patch SHA256 和完整 tree 后创建新分支;tree 52c82122e62de832aa9a39b63411c1563a1b5e80 与本地提交完全相同。SDK 覆盖、发布工作流和测试宿主没有进入本 PR。首次发布的传输文本校验失败在写入候选分支前被拦住;修正后仍通过相同哈希检查。

没有新长压测或全仓 CI 结论。真实内联压缩分发的异常、背压、lease 释放集成回归,以及普通无 metadata 组合性能仍待验证;草稿 PR 不代表发行验收通过。

说明文件:doc/performance-audit/stack4/07-compressed-metadata-reuse.md。

@SunSi12138
SunSi12138 changed the base branch from perf/stack4-06-dto-construction-20260909 to dev September 9, 2026 13:32
@SunSi12138
SunSi12138 marked this pull request as ready for review September 9, 2026 13:34

Copy link
Copy Markdown
Owner Author

针对“无 metadata 是默认路径,不应为可选优化付出代价”的反馈,已补充保守修订:生产提交 2f7c7d8,测试导入补全 2be0af9。基于当时最新的 80e6f6b 追加,保留你推进栈时的更新,没有强推、改 base 或自动合并。

  1. 非压缩请求仍完全不进入本次解码分支。
  2. 内联压缩但无 metadata:先判断 HasMetadata,然后保持原有 DecodeInboundPayload → retained input.Dispose → CompleteDecode → ReadRequestEnvelope 顺序。不创建 encodedPayload 序列快照、不比较前缀、不调用 ReadDecoded;未新增对象。压缩分支内仍有一次标志判断,不能表述为所有机器码成本绝对相同。
  3. 只有有 metadata 的内联压缩请求才保存原始序列,在两个 owner 有效时比较并复用 metadata。ServerRequestEnvelopeReader.cs 与原 PR 逐字节相同,第一次严格解析、限额、deadline、异常路径不放宽。

重新验证:最终 Release 0 警告/0 错误;按仓库风格关闭隐式 using 的定向测试宿主,默认硬件与禁用 intrinsics 分别 28/28 通过(13 envelope + 9 compression + 6 新增)。包含实际 Session 解压及带/不带预算、边界/分段/改写;不是完整 Unary/Oneway 准入释放竞争集成回归。

性能结论严格区分:历史 +5.12% 是“带 TimeBudget 的两阶段解包”控制,不是默认 Add 的 QPS 回退,两边都调用原 Read。此次重复的进程间、同进程及 CPU-clock 对照均出现非平稳性。曾尝试把无 metadata 也改为前缀重绑,初始正结果未在所有复测中保持,所以该更激进方案已经撤出,任何初期 −22%/−6% 不能算作本提交的效果。

本次完成的是默认路径的代码隔离和原释放顺序恢复;没有新的最终版本 TCP QPS/p99 验收,不能声称已定量消除历史 5.12%。相关说明已经追加进 PR 内文档,原负结果保留。

@SunSi12138
SunSi12138 marked this pull request as draft September 9, 2026 13:48
@SunSi12138
SunSi12138 marked this pull request as ready for review September 9, 2026 13:48
@SunSi12138
SunSi12138 marked this pull request as draft September 9, 2026 14:52
@SunSi12138
SunSi12138 marked this pull request as ready for review September 9, 2026 14:52
@SunSi12138
SunSi12138 merged commit 868a8eb into dev Sep 9, 2026
5 checks passed
@SunSi12138
SunSi12138 deleted the perf/stack4-07-metadata-reuse-20260909 branch September 9, 2026 15:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant