|
1 | 1 | # RPC Performance History |
2 | 2 |
|
3 | | -该文档由 CI 持续维护,用于记录 Java-RPC 真实端到端调用链路的性能快照。 |
| 3 | +该文档由 CI 持续维护,用于记录 Java-RPC 真实端到端调用链路在不同协议、序列化器、注册中心和网络条件下的性能数据。 |
4 | 4 |
|
5 | | -> 这些数据来自 GitHub Hosted Runner,适合观察趋势和发现明显回归,不作为绝对性能承诺或硬性合并门槛。测试固定使用 Local Registry + Netty + Kryo,并保持固定 warmup、请求量和并发度以提高不同运行之间的可比性。 |
| 5 | +> 数据来自 GitHub Hosted Runner,适合比较实现差异、观察趋势和发现明显回归,不作为绝对性能承诺或硬性合并门槛。CI 使用正交矩阵:一次只改变一个主要变量,避免全笛卡尔积既昂贵又难解释。 |
6 | 6 |
|
7 | | -## 测试配置 |
| 7 | +## CI 性能矩阵 |
8 | 8 |
|
9 | | -- Warmup:100 次 RPC |
10 | | -- 顺序阶段:200 次 RPC,并发度 1 |
11 | | -- 并发阶段:1000 次 RPC,并发度 16 |
12 | | -- Registry:`local` |
13 | | -- Protocol:`netty` |
14 | | -- Serializer:`kryo` |
15 | | -- 记录指标:吞吐、Avg、P50、P95、P99、Max,以及 Client / Server 内置 metrics |
| 9 | +### 协议 |
| 10 | + |
| 11 | +固定 `Local Registry + Kryo + loopback`: |
| 12 | + |
| 13 | +- `netty` |
| 14 | +- `http` |
| 15 | +- `http2` |
| 16 | +- `grpc` |
| 17 | + |
| 18 | +### 序列化 |
| 19 | + |
| 20 | +固定 `Local Registry + Netty + loopback`: |
| 21 | + |
| 22 | +- `kryo` |
| 23 | +- `java` |
| 24 | +- `json` |
| 25 | +- `protobuf` |
| 26 | + |
| 27 | +### 注册中心 |
| 28 | + |
| 29 | +固定 `Netty + Kryo + loopback`: |
| 30 | + |
| 31 | +- `local` |
| 32 | +- `nacos`(CI 启动真实 `nacos/nacos-server:v2.5.4` Docker) |
| 33 | + |
| 34 | +### 网络 |
| 35 | + |
| 36 | +固定 `Local Registry + Netty + Kryo`,通过 Linux `tc netem` 作用于 `lo`: |
| 37 | + |
| 38 | +- 原始 loopback(baseline) |
| 39 | +- `delay 20ms ± 5ms` + normal jitter |
| 40 | +- `delay 10ms ± 2ms` + `loss 0.2%` |
| 41 | +- `delay 5ms` + `rate 1mbit` |
| 42 | + |
| 43 | +> `tc` 场景的目的不是模拟某个运营商的精确 SLA,而是稳定制造 RTT、抖动、丢包和带宽约束,观察 RPC 的 P95/P99、吞吐和 timeout 行为。由于当前性能用例 payload 较小,带宽场景主要用于发现排队/协议开销趋势;如果后续加入大对象 RPC,再单独增加大 payload 网络矩阵。 |
| 44 | +
|
| 45 | +## 记录指标 |
| 46 | + |
| 47 | +每个场景都会记录: |
| 48 | + |
| 49 | +- 顺序调用与并发调用的 Throughput |
| 50 | +- Avg / P50 / P95 / P99 / Max latency |
| 51 | +- Client / Server 的 total、success、failed、timeout、active |
| 52 | +- Client / Server 内置 metric 的平均与最大耗时 |
| 53 | +- Registry / Protocol / Serializer / Network profile |
| 54 | +- Java / CPU / Runner 信息 |
| 55 | + |
| 56 | +PR CI 会执行完整矩阵作为验证;只有 `main` CI 全绿后才自动把矩阵结果追加到本文档。 |
16 | 57 |
|
17 | 58 | ## 历史记录 |
18 | 59 |
|
19 | | -### PR #11 CI 基线 |
| 60 | +### PR #11 CI 单一基线(矩阵启用前) |
20 | 61 |
|
21 | 62 | - Commit: `281d526ebe6ccd0e970453fc9094b85bf08cfe96` |
22 | 63 | - Java: `17.0.20.1` |
23 | 64 | - CPU visible to JVM: `4` |
| 65 | +- Registry / Protocol / Serializer: `local / netty / kryo` |
| 66 | +- Network: loopback |
24 | 67 |
|
25 | 68 | | Phase | Requests | Concurrency | Throughput req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | |
26 | 69 | | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | |
27 | 70 | | sequential | 200 | 1 | 482.033 | 2.066 | 1.535 | 4.578 | 6.195 | 9.340 | |
28 | 71 | | concurrent | 1000 | 16 | 1537.520 | 10.250 | 9.376 | 17.876 | 22.806 | 27.916 | |
29 | 72 |
|
30 | | -#### Framework metrics |
| 73 | +<details><summary>Framework metrics</summary> |
31 | 74 |
|
32 | 75 | | Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | |
33 | 76 | | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | |
|
36 | 79 | | concurrent | CLIENT | 1000 | 1000 | 0 | 0 | 0 | 9.692 | 25.216 | |
37 | 80 | | concurrent | SERVER | 1000 | 1000 | 0 | 0 | 0 | 0.661 | 12.092 | |
38 | 81 |
|
| 82 | +</details> |
| 83 | + |
39 | 84 | --- |
40 | 85 |
|
41 | 86 | ## CI Snapshot — 2026-09-14 09:14:08 UTC — `c525edb` |
42 | 87 |
|
43 | | - |
44 | | - |
45 | 88 | - Commit: `c525edb58daffb37267b544e5928f0fb4db5ab49` |
46 | 89 | - Protocol: `netty` |
47 | 90 | - Serializer: `kryo` |
|
62 | 105 | | sequential | SERVER | 200 | 200 | 0 | 0 | 0 | 0.190 | 2.493 | |
63 | 106 | | concurrent | CLIENT | 1000 | 1000 | 0 | 0 | 0 | 8.364 | 20.758 | |
64 | 107 | | concurrent | SERVER | 1000 | 1000 | 0 | 0 | 0 | 0.791 | 5.687 | |
65 | | - |
|
0 commit comments