mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-28 07:57:01 +00:00
a30357d21e
* 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
214 lines
4.9 KiB
Markdown
214 lines
4.9 KiB
Markdown
# Issue #712 multipart PUT server-path 静默验证 Runbook
|
||
|
||
## 1. 目的
|
||
|
||
本文给 `#712` 第二批工作提供一个只关注 multipart server path 的静默验证 runbook。
|
||
|
||
目标:
|
||
|
||
1. 不再扩散客户端参数矩阵
|
||
2. 固定当前推荐 baseline
|
||
3. 把注意力集中到 server-path 观测增强后的阶段结果
|
||
|
||
## 2. 固定 baseline
|
||
|
||
当前固定 baseline:
|
||
|
||
1. `1GiB -> 64MiB part / pc4`
|
||
2. `2GiB -> 128MiB part / pc4`
|
||
|
||
可选补充:
|
||
|
||
1. `2GiB -> 256MiB part / pc4`
|
||
|
||
但默认不作为首选 baseline。
|
||
|
||
## 3. 推荐脚本
|
||
|
||
直接使用:
|
||
|
||
1. `scripts/run_gt1g_multipart_put_server_path_focus.sh`
|
||
|
||
该脚本默认只跑:
|
||
|
||
1. `1g-64m-pc4`
|
||
2. `2g-128m-pc4`
|
||
|
||
可选补充:
|
||
|
||
1. `2g-256m-pc4`
|
||
|
||
## 4. 静默执行命令
|
||
|
||
### 4.1 默认两组
|
||
|
||
```bash
|
||
bash scripts/run_gt1g_multipart_put_server_path_focus.sh \
|
||
--host 127.0.0.1:9000 \
|
||
--access-key rustfsadmin \
|
||
--secret-key rustfsadmin \
|
||
--bucket-prefix issue712-multipart-focus \
|
||
--duration 10m \
|
||
--out-dir target/bench/issue712-multipart-server-path-focus
|
||
```
|
||
|
||
### 4.2 加上 `2g-256m-pc4`
|
||
|
||
```bash
|
||
bash scripts/run_gt1g_multipart_put_server_path_focus.sh \
|
||
--host 127.0.0.1:9000 \
|
||
--access-key rustfsadmin \
|
||
--secret-key rustfsadmin \
|
||
--bucket-prefix issue712-multipart-focus \
|
||
--duration 10m \
|
||
--profiles 1g-64m-pc4,2g-128m-pc4,2g-256m-pc4 \
|
||
--out-dir target/bench/issue712-multipart-server-path-focus-wide
|
||
```
|
||
|
||
## 5. 强制要求
|
||
|
||
这轮 runbook 的要求是:
|
||
|
||
1. 静默跑
|
||
2. 只读 `summary.csv`
|
||
3. 如需解释异常,再去看 dashboard / 日志
|
||
|
||
## 6. 结果目录
|
||
|
||
建议统一:
|
||
|
||
```text
|
||
target/bench/
|
||
issue712-multipart-server-path-focus/
|
||
run_manifest.txt
|
||
commands.txt
|
||
summary.csv
|
||
logs/
|
||
benchdata/
|
||
```
|
||
|
||
## 7. 需要记录的指标
|
||
|
||
最终结果表之外,强制记录以下阶段:
|
||
|
||
1. `multipart_ingress_prepare`
|
||
2. `multipart_set_disk_writer_setup`
|
||
3. `multipart_set_disk_encode`
|
||
4. `multipart_complete_tail`
|
||
|
||
同时建议固定记录 multipart path 计数:
|
||
|
||
1. `multipart_write_pipeline`
|
||
2. `multipart_write_pipeline_batched_large`
|
||
3. `multipart_write_single_block_non_inline`
|
||
|
||
## 8. 本轮的判断顺序
|
||
|
||
先看:
|
||
|
||
1. `summary.csv`
|
||
|
||
再看:
|
||
|
||
1. `multipart_complete_tail`
|
||
2. `multipart_set_disk_encode`
|
||
3. `multipart_set_disk_writer_setup`
|
||
4. `multipart_ingress_prepare`
|
||
|
||
## 9. 结果解释
|
||
|
||
### 9.1 `summary.csv` 先分出好坏组合
|
||
|
||
先回答:
|
||
|
||
1. `1GiB / 64MiB / pc4` 是否仍是最稳 baseline
|
||
2. `2GiB / 128MiB / pc4` 是否仍是最稳 baseline
|
||
|
||
### 9.2 再用 Dashboard 回答热点层
|
||
|
||
再回答:
|
||
|
||
1. `multipart_complete_tail` 是否最高
|
||
2. `multipart_set_disk_encode` 是否主导
|
||
3. `multipart_set_disk_writer_setup` 是否异常高
|
||
4. `multipart_ingress_prepare` 是否已经被 body buffering 放大
|
||
|
||
## 10. 下一步动作判定
|
||
|
||
### 如果 `multipart_set_disk_encode` 最高
|
||
|
||
下一步优先:
|
||
|
||
1. multipart part 专用 batching gate
|
||
2. multipart encode path 单独策略
|
||
|
||
### 如果 `multipart_complete_tail` 最高
|
||
|
||
下一步优先:
|
||
|
||
1. complete path metadata / checksum / rename tail 优化
|
||
|
||
### 如果 `multipart_set_disk_writer_setup` 最高
|
||
|
||
下一步优先:
|
||
|
||
1. writer init / bitrot writer path 优化
|
||
|
||
### 如果 `multipart_ingress_prepare` 最高
|
||
|
||
下一步优先:
|
||
|
||
1. part ingress buffer 分层
|
||
2. body read / HashReader 前的缓冲调整
|
||
|
||
## 11. `multipart_*` 指标为空时的排查顺序
|
||
|
||
如果本轮跑的是 multipart PUT,但 Prometheus 里查不到任何 `multipart_*` stage:
|
||
|
||
1. 先不要直接判定“新打点无效”
|
||
2. 先查当前 `rustfs_s3_put_object_stage_duration_ms` 里到底有哪些 stage
|
||
3. 如果只看到了 ordinary PUT 的 `ingress_prepare` / `set_disk_writer_setup` / `set_disk_encode` / `set_disk_rename`,要优先怀疑当前 `127.0.0.1:9000` 上跑的不是预期的新二进制
|
||
|
||
推荐先查:
|
||
|
||
```promql
|
||
topk(
|
||
40,
|
||
count by (__name__, stage) (
|
||
{__name__=~"rustfs_s3_put_object_stage_duration_ms.*"}
|
||
)
|
||
)
|
||
```
|
||
|
||
如果结果里只有 ordinary stage,而没有:
|
||
|
||
1. `multipart_ingress_prepare`
|
||
2. `multipart_set_disk_writer_setup`
|
||
3. `multipart_set_disk_encode`
|
||
4. `multipart_complete_tail`
|
||
|
||
则应优先检查:
|
||
|
||
1. 本轮 RustFS 进程是否确实来自当前 worktree 的 `target/debug/rustfs`
|
||
2. 重启脚本是否真的清掉了旧进程
|
||
3. `RUSTFS_OBS_ENDPOINT` 是否仍然指向当前可查询 backend
|
||
|
||
## 12. 已确认的假阴性根因样例
|
||
|
||
在 `2026-06-24` 的第三批继续验证中,出现过一次典型假阴性:
|
||
|
||
1. multipart benchmark 已经成功跑完
|
||
2. Prometheus 里却只有 ordinary PUT stage,没有任何 `multipart_*`
|
||
3. 根因并不是打点代码失效,而是 `127.0.0.1:9000` 上仍然挂着更早启动的旧 RustFS 进程
|
||
|
||
纠偏方式:
|
||
|
||
1. 用当前 worktree 的 `target/debug/rustfs` 前台直接拉起服务
|
||
2. 再跑最小化 focused smoke
|
||
3. 立刻查询 `multipart_*` stage
|
||
|
||
这次纠偏后的前台复测已经确认:
|
||
|
||
1. `multipart_*` 四个阶段可以正常上报
|
||
2. 当前热点仍然稳定落在 `multipart_set_disk_encode`
|