Skip to content

ci: build production-like RPC performance matrix - #13

Merged
xiaoyumuxi merged 8 commits into
mainfrom
ci/performance-matrix
Sep 14, 2026
Merged

xiaoyumuxi merged 8 commits into
mainfrom
ci/performance-matrix

Conversation

@xiaoyumuxi

@xiaoyumuxi xiaoyumuxi commented Sep 14, 2026 •

Copy link
Copy Markdown
Owner

目标与基线

以 gRPC + 真实 Nacos 2.5.4 Docker + Protobuf + 1 KiB + tc LAN 为默认性能场景。Local Registry 仅作对照;长期记录仍使用 docs/PERFORMANCE.md,没有恢复性能 artifact 或 Actions Summary 作为长期记录。

15 个场景(全部保留)

  • 基线:gRPC / Nacos / Protobuf / LAN / 1 KiB。
  • Payload 对照:64 B、16 KiB、256 KiB。
  • Serializer 对照:Kryo、Java、JSON(gRPC 信封仍是 Protobuf,变化的是参数/返回值序列化)。
  • Registry 对照:Local。
  • 网络对照:跨 AZ / 私网、普通公网、跨地域公网、弱网 / 移动网络。
  • Protocol 对照:Netty、HTTP、HTTP/2。
网络档位 单向附加时延 / 抖动 名义附加 RTT 随机丢包设置 rate 设置
LAN 1 ms ± 0.2 ms 约 2 ms 0 1 gbit
跨 AZ / 私网 3 ms ± 1 ms 约 6 ms 0 500 mbit
普通公网 25 ms ± 5 ms 约 50 ms 0.05% 100 mbit
跨地域公网 60 ms ± 10 ms 约 120 ms 0.1% 50 mbit
弱网 / 移动网络 120 ms ± 40 ms 约 240 ms 1% 5 mbit

每个场景分配独立 RPC 端口(预留范围 19091–19120),而不是复用 19090。tc 使用端口过滤塑形 RPC 数据流,不把 Nacos 控制面作为本轮网络故障注入目标。

本轮修复的 CI 阻塞问题

HTTP/2 / gRPC 生命周期隔离

之前 child stream 直接挂了共享 NettyRpcClientHandler;某个流正常结束时触发 channelInactive -> failAll,使其他在途请求也报 ClosedChannelException。

新增每流独立 RpcStreamResponseHandler,只路由该流响应/失败。TCP 父连接关闭仍然清理该连接的全部请求。保留之前的 HTTP/2 connection-ready gate。

gRPC 分帧与完成条件

之前把一个 HTTP/2 DATA frame 当成一个完整 gRPC 消息,无法正确处理拆分的 5 字节消息头或跨多个 DATA frame 的大消息。

新增有上限的 GrpcMessageAccumulator,支持分片累积、256 KiB 请求/响应,拒绝超限、截断和多余 unary 消息。客户端在收到成功 grpc-status 尾帧后才完成 Future,不能把单独的 DATA 当作调用成功。

Nacos 消费端可见性

Provider 注册成功之后,使用与 RpcClient 相同的 SPI discovery 实例轮询,必须确认发现的是本次 provider 的正确地址/端口。最多等待 30 秒,超时明确失败;不绕过 Nacos,不用 mock,也不把这个等待算入 RPC 延迟。

测试与诊断

新增流完成隔离、RST_STREAM 隔离、父连接关闭、requestId 不匹配、拆分消息头、大消息重组、错误尾帧、长度上限/截断等回归测试。修正原有成功响应测试的非法 DATA END_STREAM 写法,并新增缺失尾帧必须失败的负向测试。

修复 benchmark logback appender 配置,让 ERROR 日志真正可见。弱网下依然不允许响应数据损坏;客户端 metrics 必须与实测成功/失败数量一致。严格场景仍要求全部成功。

验证记录

  • CI #40 / commit 19d2bb5:Build、RPC Integration、完整 15 场景性能矩阵通过(Scenario failures: 0)。单测发现原有 gRPC 测试没有状态尾帧;因此该轮整体门禁仍失败,不能标记成整套 CI 成功。
  • commit 75070ff 已修正旧用例并补上缺失尾帧的负向测试。以该提交最新 Actions 结果为准。

测量范围和限制

这是同一 Runner、同一测试 JVM、真实 TCP loopback 上施加 tc 的合成实验,不是跨物理主机或真实公网压测;没有 TLS。当前同一个 netem 队列覆盖两个方向,rate 不能解释为双向各自独享的带宽。

矩阵不是所有配置的笛卡尔积。各场景采样量/并发度有差异,报告会明确列出,因此不能仅按一个 QPS 数字作严格横向排名。P95/P99 仅统计成功请求,小样本不支持尾延迟 SLA 结论。弱网服务端指标是观察区间统计,可能包含前阶段超时后晚到的请求。

仅 main push 且完整门禁成功后自动追加 Markdown;PR 的 Record Performance 跳过是预期行为。PR 保持 open,未合并。

@xiaoyumuxi xiaoyumuxi changed the title ci: expand RPC performance coverage matrix ci: build production-like RPC performance matrix Sep 14, 2026

Copy link
Copy Markdown
Owner Author

CI 阻塞修复已完成验证

最新提交:75070ff1a4c8fd196d94eecb4012f797507ffcfe

验证运行:CI #41 / 34835453911

Check 实际结果
Build success
Unit Tests & Coverage success
RPC Integration success
RPC Performance Matrix success
CI Gate success
Record Performance skipped(PR 不回写 main,符合预期)

保留并完整执行原有 15 场景,未删除协议/序列化器/真实 Nacos/tc 网络用例。19d2bb5 的前一轮性能矩阵也已通过;该轮整体失败仅剩旧 gRPC 测试缺少状态尾帧,随后由 75070ff 修正并新增负向测试,最新整套门禁已通过。

本轮修复包含:每个 HTTP/2/gRPC stream 独立失败处理、gRPC 消息头/大消息跨 DATA 帧重组、等待成功 grpc-status 尾帧、Nacos 消费端对当前 provider 的有界可见性检查、benchmark 错误日志配置。相关回归测试已在本轮单元测试中通过。

性能历史仍使用 docs/PERFORMANCE.md;本次 PR 没有执行 main 自动回写,也没有合并本 PR。

@xiaoyumuxi
xiaoyumuxi merged commit fc639de into main Sep 14, 2026
6 checks passed
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