Files
rustfs/docs/operations/issue-712-deeper-zero-copy-next-steps-zh.md
T
houseme a30357d21e feat(storage): extend PUT path tuning and observability (#3829)
* feat(storage): add multipart put stage metrics

* feat(scripts): add multipart put focus runner

* docs(operations): add multipart put server-path guides

* chore(scripts): add local rustfs restart helper

* docs(observability): add local metrics backend guide

* docs(observability): add localized multipart guides

* fix(ecstore): validate multipart batching path

* feat(obs): add erasure encode overlap metrics

* docs(ops): update overlap retest summary

* docs(ops): add batchblocks retest matrix

* docs(ops): extend overlap candidate summary

* docs(ops): capture 8-run overlap summary

* feat(storage): switch rename_data to msgpack map

* test(storage): add rename_data payload checks

* feat(object): add zero_copy_eager put path

* docs(ops): add zero_copy_eager put guide

* docs(ops): add deeper zero-copy next steps
2026-06-25 19:24:35 +08:00

73 lines
2.2 KiB
Markdown

# Issue #712 更深一层 zero-copy 下一阶段说明
## 1. 当前结论
当前分支已经具备:
1. `rename_data``msgpack named-map + JSON fallback`
2. ordinary PUT 的 `zero_copy_eager` 实验路径
其中 `zero_copy_eager` 已经是实际命中的业务路径,但它当前仍然不是端到端严格意义上的 zero-copy write path。
## 2. 当前 copy 还存在的层
当前 plain PUT 即使命中了 `zero_copy_eager`,仍然会在后续链路里发生复制,主要位置在:
1. `HashReader::from_stream(...)`
2. `Erasure::encode(...)` 的 block ingest
从当前代码 review 看,优先级更高的是:
1. `Erasure::encode`
而不是:
1. `HashReader`
## 3. 为什么先看 `Erasure::encode`
原因:
1. `HashReader` 主要负责包装 `AsyncRead` 与 checksum 语义,不是最直接的热点
2. `Erasure::encode` 目前仍然是每个 block 读入 `Vec<u8>` 后再进入编码
3. 这更像是 plain PUT 的下一层实际 copy 热点
## 4. 这轮已经尝试过但不保留的方向
本轮已经试过一个很小的局部改动:
1. 对 full block 优先走 `encode_data_owned(...)`
结果:
1. 对某些 ordinary PUT 面有正向迹象
2. 但不同 size 下收益不稳定
3. 因此当前不建议直接基于这个 patch 继续往前推
## 5. 下一阶段更稳妥的技术方向
如果要继续做更深一层 zero-copy,建议优先考虑:
1.`Erasure::encode` 设计更稳定的 block buffer 生命周期
2. 让 full block ingest 更接近 `Bytes` / owned buffer 复用
3. 避免在当前函数内继续做更多“局部替换一个调用”的小补丁
换句话说,下一阶段更适合做:
1. block buffer 生命周期设计
2. owned block ring / reusable block pool
3. encode/write 之间更明确的 buffer ownership
而不是先做:
1. `HashReader` 级别的大改
2. 更多无设计托底的局部 `Vec<u8>` 调整
## 6. 当前建议
当前最稳妥的推进顺序:
1. 先把当前 `zero_copy_eager` 路径继续作为实验性 ordinary PUT 路径保留
2. 如果要继续做 deeper zero-copy,单独开一个新阶段
3. 该阶段优先聚焦 `Erasure::encode` ingest / buffer lifecycle,而不是先改 `HashReader`