mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-11 23:56:53 +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
8.5 KiB
8.5 KiB
Issue #712 encode / write overlap 观测小结
1. 目的
本文记录 #712 新一轮更细主线的第一步结果:
- 不先冒进改
encode.rs调度语义 - 先把
multipart_set_disk_encode内部拆成更细阶段 - 用 focused benchmark 判断当前 overlap 更像卡在 encode 侧、write 侧,还是 batch barrier
2. 新增内部阶段
本轮在 crates/ecstore/src/erasure_coding/encode.rs 中补充了内部阶段观测,使用指标:
rustfs_internal_stage_duration_ms
新增阶段:
erasure_encode_cpuerasure_encode_send_waiterasure_encode_recv_waiterasure_encode_writeerasure_encode_shutdownerasure_encode_batched_send_waiterasure_encode_batched_recv_waiterasure_encode_batched_writeerasure_encode_batched_shutdown
3. focused baseline
profile:
2g-128m-pc4
默认 batched 配置(RUSTFS_ERASURE_ENCODE_BATCH_BLOCKS=4)下,本轮 observed run 结果为:
- Throughput:
351.96 MiB/s - Avg latency:
5842.1ms - path:
multipart_write_pipeline_batched_large
从 raw sum / count 推出的内部均值近似为:
erasure_encode_cpu:~2.95mserasure_encode_batched_send_wait:~0.01mserasure_encode_batched_recv_wait:~105.3mserasure_encode_batched_write:~75.4mserasure_encode_batched_shutdown:~0.90ms
4. 第一轮判断
这组数据说明:
send_wait几乎可以忽略,说明 encode producer 基本没有被 queue backpressure 卡住recv_wait明显高于write,说明 consumer 侧更常见的是在等下一批 encode 结果,而不是 writer 太慢导致队列打满cpu本身并不大,真正放大的是 batched producer/consumer 之间的批次屏障
换句话说,这一轮更像是:
- writer 在等 encoder / 等 batch 集齐
- 而不是 encoder 在等 writer
5. 配置性验证
为了验证 batch barrier 假设,本轮只改一个变量:
RUSTFS_ERASURE_ENCODE_BATCH_BLOCKS=2
同样只跑:
2g-128m-pc4
结果:
- Throughput:
368.57 MiB/s - Avg latency:
5537.3ms - path:
multipart_write_pipeline_batched_large
raw sum / count 推导的内部均值近似为:
erasure_encode_cpu:~2.94mserasure_encode_batched_send_wait:~0.01mserasure_encode_batched_recv_wait:~48.9mserasure_encode_batched_write:~35.9mserasure_encode_batched_shutdown:~0.36ms
6. 当前结论
这轮可以先收敛出一个相对明确的方向:
- 当前 batched 路径的第一优先问题不像是 encode CPU 绝对太重
- 更像是 batch size 偏大,导致 writer 侧等待下一批 encode 结果的时间被放大
- 把
RUSTFS_ERASURE_ENCODE_BATCH_BLOCKS从4降到2后,结果明显好于默认值
7. 当前建议
下一步如果继续沿着 overlap 这条线推进,建议优先级如下:
- 先把
RUSTFS_ERASURE_ENCODE_BATCH_BLOCKS=2作为 batched 路径的候选值继续复测 - 再决定是否要把 multipart batched path 的 batch size 做成与 ordinary PUT 分离
- 在没有更多证据前,不要继续尝试更激进的 batch 内单次 blocking encode 调度改法
8. 第二轮更稳妥复测
为了减少热态偏差,本轮又按 4 -> 2 -> 4 -> 2 做了四轮受控复测。
profile 固定:
2g-128m-pc4
结果:
b4-r1:317.20 MiB/s,6515.2msb2-r1:300.38 MiB/s,6842.8msb4-r2:334.58 MiB/s,5966.5msb2-r2:358.77 MiB/s,5748.2ms
从这组数据看:
batch_blocks=2不是每一轮都赢- 但
b2-r2明显优于同组前后的b4-r2 - 结果仍然存在不小波动,因此还不足以直接改代码默认值
9. 第二轮内部阶段对比
对 b4-r2 与 b2-r2 的 raw sum / count 做近似均值后,可以看到:
b4-r2
erasure_encode_batched_recv_wait:~107.4mserasure_encode_batched_write:~78.2mserasure_encode_cpu:~3.19ms
b2-r2
erasure_encode_batched_recv_wait:~50.9mserasure_encode_batched_write:~37.7mserasure_encode_cpu:~3.06ms
这说明:
batch_blocks=2的主要收益方向仍然是降低 batched consumer 侧等待时间cpu本身没有发生决定性变化- 当前更像是在改善 batch barrier,而不是改变编码计算本体
10. 当前收敛结论
到这一轮为止,更稳妥的结论是:
RUSTFS_ERASURE_ENCODE_BATCH_BLOCKS=2仍然值得保留为候选配置- 它对
erasure_encode_batched_recv_wait的改善方向是清晰的 - 但吞吐/延迟收益还不够稳定,当前不建议直接改默认值
- 下一步更适合继续以环境变量方式复测,而不是马上把默认值写死到代码里
11. 第三轮补齐后的小结
按低噪声矩阵继续补到 6 轮之后,结果如下:
b4-r1:317.20 MiB/s,6515.2msb2-r1:300.38 MiB/s,6842.8msb4-r2:334.58 MiB/s,5966.5msb2-r2:358.77 MiB/s,5748.2msb4-r3:323.35 MiB/s,6412.4msb2-r3:350.87 MiB/s,5827.6ms
按组汇总:
batch_blocks=4
- Avg throughput:
325.04 MiB/s - Median throughput:
323.35 MiB/s - Avg latency:
6298.0ms - Median latency:
6412.4ms
batch_blocks=2
- Avg throughput:
336.67 MiB/s - Median throughput:
350.87 MiB/s - Avg latency:
6139.5ms - Median latency:
5827.6ms
这说明:
batch_blocks=2经过6轮汇总后,组均值已经优于4- 但单轮结果仍然存在明显波动,因此还不能把它视为“完全稳定结论”
12. 第三轮内部阶段补充
从 b4-r3 与 b2-r3 的 raw sum / count 看:
b4-r3
erasure_encode_batched_recv_wait:~115.55mserasure_encode_batched_write:~80.15mserasure_encode_cpu:~3.55ms
b2-r3
erasure_encode_batched_recv_wait:~52.46mserasure_encode_batched_write:~37.99mserasure_encode_cpu:~3.12ms
这与前一组 b4-r2 / b2-r2 的方向一致,说明:
batch_blocks=2主要还是在改善 batch barrier- 下降最明显的仍然是 consumer 侧等待时间
cpu本体没有决定性变化
13. 当前更新后的建议
到这一步,建议可以进一步收敛为:
RUSTFS_ERASURE_ENCODE_BATCH_BLOCKS=2仍然保留为 multipart batched 路径的强候选配置- 它已经具备“方向明确、组均值更优”的证据
- 但由于单轮波动仍在,当前更合适的动作仍然是继续以 env 方式复测,而不是直接改代码默认值
14. 第四轮补齐后的更新判断
继续按同一矩阵补到 8 轮之后,新增结果为:
b4-r4:296.34 MiB/s,6977.8msb2-r4:248.68 MiB/s,8310.8ms
这样 8 轮完整结果为:
b4-r1:317.20 MiB/s,6515.2msb2-r1:300.38 MiB/s,6842.8msb4-r2:334.58 MiB/s,5966.5msb2-r2:358.77 MiB/s,5748.2msb4-r3:323.35 MiB/s,6412.4msb2-r3:350.87 MiB/s,5827.6msb4-r4:296.34 MiB/s,6977.8msb2-r4:248.68 MiB/s,8310.8ms
按组重新汇总:
batch_blocks=4
- Avg throughput:
317.87 MiB/s - Median throughput:
320.27 MiB/s - Avg latency:
6468.0ms - Median latency:
6463.8ms
batch_blocks=2
- Avg throughput:
314.68 MiB/s - Median throughput:
325.62 MiB/s - Avg latency:
6682.4ms - Median latency:
6335.2ms
15. 第四轮后的结论修正
补齐到 8 轮之后,需要把结论进一步收紧:
batch_blocks=2仍然能稳定改善erasure_encode_batched_recv_wait- 但吞吐/延迟层面的总收益并没有收敛成稳定优势
b2-r4明显把组均值重新拉回,说明它目前还只是“有潜力的候选配置”,不是“已经证实优于 4 的配置”
从 b4-r4 与 b2-r4 的 raw sum / count 看:
b4-r4
erasure_encode_batched_recv_wait:~131.18mserasure_encode_batched_write:~82.04mserasure_encode_cpu:~3.95ms
b2-r4
erasure_encode_batched_recv_wait:~81.49mserasure_encode_batched_write:~45.22mserasure_encode_cpu:~5.38ms
这说明:
batch_blocks=2对 wait/write 的改善方向依旧成立- 但这次同时伴随更差的整体 throughput/latency
- 当前还不能把局部内部阶段改善直接视为端到端收益
16. 当前最稳妥的建议
到这一步,最稳妥的建议是:
RUSTFS_ERASURE_ENCODE_BATCH_BLOCKS=2继续保留为 env-only 候选配置- 当前不要改代码默认值
- 后续如果继续验证,应优先排查为什么
b2-r4会出现这种明显反向波动,而不是继续机械追加更多轮次