From bb11b29b42e2ea007d31a90fc986094ffa1fcd52 Mon Sep 17 00:00:00 2001 From: Xiaoyumuxi <3075514079@qq.com> Date: Mon, 14 Sep 2026 19:33:03 +0800 Subject: [PATCH] docs: split performance reports by CI run and localize output --- .github/scripts/run-performance-matrix.sh | 150 ++-- .github/workflows/ci.yml | 52 +- docs/PERFORMANCE.md | 754 ++---------------- .../2026-09-14_09-14-08Z_c525edb.md | 28 + .../2026-09-14_11-23-30Z_fc639de.md | 375 +++++++++ docs/performance/legacy/281d526_pr11.md | 25 + 6 files changed, 624 insertions(+), 760 deletions(-) create mode 100644 docs/performance/2026-09-14/2026-09-14_09-14-08Z_c525edb.md create mode 100644 docs/performance/2026-09-14/2026-09-14_11-23-30Z_fc639de.md create mode 100644 docs/performance/legacy/281d526_pr11.md diff --git a/.github/scripts/run-performance-matrix.sh b/.github/scripts/run-performance-matrix.sh index 5902204..4ac3f6b 100755 --- a/.github/scripts/run-performance-matrix.sh +++ b/.github/scripts/run-performance-matrix.sh @@ -11,12 +11,13 @@ RPC_PORT_START=19090 RPC_PORT_END=19120 BASE_PAYLOAD_BYTES="1024" NACOS_ADDRESS="127.0.0.1:8848" +REPORT_RUN_TIME_UTC="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" rm -rf "$MATRIX_DIR" mkdir -p "$MATRIX_DIR" "$LOG_DIR" if ! command -v tc >/dev/null 2>&1; then - echo "Linux tc is required for network emulation." >&2 + echo "性能矩阵需要 Linux tc 命令。" >&2 exit 1 fi @@ -26,8 +27,8 @@ cleanup() { } trap cleanup EXIT -# Resolve and compile everything before tc is applied so dependency downloads never pollute network scenarios. -# JaCoCo is intentionally disabled in this performance job; coverage remains in the unit-test job. +# 在应用 tc 前完成依赖解析与编译,避免下载依赖污染网络场景。 +# 性能 job 显式关闭 JaCoCo;覆盖率仍由单元测试 job 负责。 mvn -B -ntp test-compile \ -pl rpc-consumer -am \ -DskipTests \ @@ -57,7 +58,7 @@ run_scenario() { scenario_index=$((scenario_index + 1)) local rpc_port=$((RPC_PORT_START + scenario_index)) if (( rpc_port > RPC_PORT_END )); then - echo "Scenario count exceeded reserved tc RPC port range ${RPC_PORT_START}-${RPC_PORT_END}." >&2 + echo "性能场景数量超过预留 RPC 端口范围 ${RPC_PORT_START}-${RPC_PORT_END}。" >&2 exit 1 fi @@ -67,7 +68,7 @@ run_scenario() { output=$(printf "%s/%02d-%s.md" "$MATRIX_DIR" "$scenario_index" "$scenario") log="$LOG_DIR/$scenario.log" - echo "::group::Performance scenario: $scenario (RPC port $rpc_port)" + echo "::group::性能场景: $scenario (RPC 端口 $rpc_port)" set +e mvn -B -ntp test \ -pl rpc-consumer -am \ @@ -95,31 +96,47 @@ run_scenario() { local summary="$SNAPSHOT_DIR/summary.md" if [[ "$status" -eq 0 && ! -s "$summary" ]]; then - echo "Scenario $scenario completed without producing $summary" >&2 + echo "场景 $scenario 已完成,但没有生成 $summary" >&2 status=2 fi { - echo "### \`$scenario\`" + echo "### 场景:\`$scenario\`" echo - echo "- Status: $([[ "$status" -eq 0 ]] && echo 'PASS' || echo 'FAIL')" - echo "- Matrix dimension: \`$category\`" - echo "- Registry / Protocol / Serializer: \`$registry / $protocol / $serializer\`" - echo "- Request payload: \`${payload_bytes} bytes\`" - echo "- RPC port: \`$rpc_port\`" - echo "- Network profile: \`$network\`" - echo "- Strict success requirement: \`$require_all_success\`" + echo "- 状态:$([[ "$status" -eq 0 ]] && echo '通过' || echo '失败')" + echo "- 矩阵维度:\`$category\`" + echo "- 注册中心 / 协议 / 序列化器:\`$registry / $protocol / $serializer\`" + echo "- 请求载荷:\`${payload_bytes} bytes\`" + echo "- RPC 端口:\`$rpc_port\`" + echo "- 网络环境:\`$network\`" + echo "- 是否要求全部请求成功:\`$require_all_success\`" echo if [[ "$status" -eq 0 ]]; then sed \ -e '1{/^# RPC CI Performance Snapshot$/d;}' \ -e '/^> Observational snapshot only\./d' \ - -e '/^Raw attempt samples are available/d' \ - -e 's/^## Framework metrics$/#### Framework metrics/' \ + -e 's/^- Commit:/- 提交:/' \ + -e 's/^- Protocol:/- 协议:/' \ + -e 's/^- Serializer:/- 序列化器:/' \ + -e 's/^- Registry:/- 注册中心:/' \ + -e 's/^- RPC port:/- RPC 端口:/' \ + -e 's/^- Request payload:/- 请求载荷:/' \ + -e 's/^- Require all requests to succeed:/- 是否要求全部请求成功:/' \ + -e 's/^- Java:/- Java:/' \ + -e 's/^- CPU visible to JVM:/- JVM 可见 CPU:/' \ + -e 's#^| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms |#| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms |#' \ + -e 's/^| sequential |/| 顺序调用 |/' \ + -e 's/^| concurrent |/| 并发调用 |/' \ + -e 's/^## Framework metrics$/#### 框架指标/' \ + -e 's#^| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms |#| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms |#' \ + -e 's/| CLIENT |/| 客户端 |/' \ + -e 's/| SERVER |/| 服务端 |/' \ + -e 's/^Latency percentiles include successful RPCs only\. Low sample counts do not establish a reliable tail-latency SLA\.$/延迟分位数仅统计成功 RPC;样本量较小时不能据此得出可靠的尾延迟 SLA。/' \ + -e 's/^Nacos visibility polling and warmup are excluded from timing\. In lossy profiles, server observation intervals may include late requests\.$/Nacos 可见性轮询和预热阶段不计入性能计时;在丢包网络下,服务端观察窗口可能包含晚到请求。/' \ "$summary" else - echo '> Scenario failed. The tail of its Maven log is included below so unsupported or broken modes remain visible.' + echo '> 该场景执行失败。下面保留 Maven 日志尾部,便于继续诊断不支持或异常的模式。' echo echo '```text' tail -n 60 "$log" @@ -129,9 +146,9 @@ run_scenario() { if [[ "$status" -ne 0 ]]; then scenario_failures=$((scenario_failures + 1)) - echo "Scenario $scenario FAILED; continuing so the rest of the matrix still runs." >&2 + echo "场景 $scenario 失败;继续执行剩余矩阵。" >&2 else - echo "Scenario $scenario passed." + echo "场景 $scenario 通过。" fi } @@ -150,14 +167,14 @@ start_nacos() { for _ in $(seq 1 60); do if curl -fsS "http://127.0.0.1:8848/nacos/v1/console/health/readiness" >/dev/null; then - echo "Nacos is ready." + echo "Nacos 已就绪。" return fi sleep 2 done docker logs rpc-perf-nacos || true - echo "Nacos did not become ready in time." >&2 + echo "Nacos 未能在规定时间内就绪。" >&2 exit 1 } @@ -168,9 +185,8 @@ reset_network() { shape_rpc_ports() { reset_network - # Every scenario gets a unique RPC endpoint in a reserved local port range. This prevents a previous Nacos - # ephemeral instance shutdown from racing a new JVM that re-registers the exact same ip:port identity. - # Only this reserved RPC data-plane range is shaped; Nacos 8848/9848/9849 stays untouched. + # 每个场景使用独立 RPC 端口,避免上一个 Nacos 临时实例退出时与新 JVM 复用同一 ip:port 产生竞态。 + # 仅塑形预留 RPC 数据面端口;Nacos 8848/9848/9849 不受影响。 sudo tc qdisc add dev lo root handle 1: prio bands 3 sudo tc qdisc add dev lo parent 1:1 handle 10: netem "$@" @@ -191,84 +207,96 @@ apply_lan_profile() { start_nacos -# Production-like baseline: gRPC + Nacos + Protobuf + synthetic LAN conditions. -# On loopback, request and response packets are both shaped, so the configured one-way delay roughly doubles -# into added request/response RTT before framework processing time is included. +# 生产型基线:gRPC + Nacos + Protobuf + 合成内网条件。 apply_lan_profile -run_scenario "baseline" "baseline-grpc-protobuf-nacos-lan" \ - "nacos" "grpc" "protobuf" "tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit" \ +run_scenario "基线" "baseline-grpc-protobuf-nacos-lan" \ + "nacos" "grpc" "protobuf" "tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit" \ "$BASE_PAYLOAD_BYTES" 20 40 120 8 8000 10000 true -# Payload matrix: keep the production baseline stack and LAN network profile fixed. +# Payload 矩阵:其余条件固定为生产基线。 for payload in 64 16384 262144; do - run_scenario "payload" "payload-${payload}b" \ - "nacos" "grpc" "protobuf" "tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit" \ + run_scenario "请求载荷" "payload-${payload}b" \ + "nacos" "grpc" "protobuf" "tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit" \ "$payload" 10 20 60 4 10000 12000 true done -# Serializer matrix: gRPC + Nacos + LAN remain fixed; Protobuf is represented by the baseline. +# 序列化矩阵:gRPC + Nacos + 内网固定;Protobuf 由基线代表。 for serializer in kryo java json; do - run_scenario "serializer" "serializer-${serializer}" \ - "nacos" "grpc" "$serializer" "tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit" \ + run_scenario "序列化器" "serializer-${serializer}" \ + "nacos" "grpc" "$serializer" "tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit" \ "$BASE_PAYLOAD_BYTES" 10 20 60 4 8000 10000 true done -# Registry matrix: Nacos is represented by the baseline; Local is retained only as a comparison control. -run_scenario "registry" "registry-local-control" \ - "local" "grpc" "protobuf" "tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit" \ +# 注册中心矩阵:Nacos 由基线代表;Local 仅作对照。 +run_scenario "注册中心" "registry-local-control" \ + "local" "grpc" "protobuf" "tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit" \ "$BASE_PAYLOAD_BYTES" 10 20 60 4 8000 10000 true -# Network matrix: gRPC + Nacos + Protobuf + 1 KiB payload remain fixed. +# 网络矩阵:固定 gRPC + Nacos + Protobuf + 1 KiB。 shape_rpc_ports delay 3ms 1ms distribution normal rate 500mbit -run_scenario "network" "network-cross-az" \ - "nacos" "grpc" "protobuf" "tc cross-AZ/private: 3ms +/-1ms one-way, ~6ms added RTT, 500mbit" \ +run_scenario "网络" "network-cross-az" \ + "nacos" "grpc" "protobuf" "tc 跨 AZ/私网:单向 3ms ±1ms,约增加 6ms RTT,500mbit" \ "$BASE_PAYLOAD_BYTES" 10 20 60 4 10000 12000 true shape_rpc_ports delay 25ms 5ms distribution normal loss 0.05% rate 100mbit -run_scenario "network" "network-public-internet" \ - "nacos" "grpc" "protobuf" "tc public internet: 25ms +/-5ms one-way, ~50ms added RTT, 0.05% loss, 100mbit" \ +run_scenario "网络" "network-public-internet" \ + "nacos" "grpc" "protobuf" "tc 普通公网:单向 25ms ±5ms,约增加 50ms RTT,丢包 0.05%,100mbit" \ "$BASE_PAYLOAD_BYTES" 10 20 60 4 12000 14000 false shape_rpc_ports delay 60ms 10ms distribution normal loss 0.1% rate 50mbit -run_scenario "network" "network-cross-region" \ - "nacos" "grpc" "protobuf" "tc cross-region: 60ms +/-10ms one-way, ~120ms added RTT, 0.1% loss, 50mbit" \ +run_scenario "网络" "network-cross-region" \ + "nacos" "grpc" "protobuf" "tc 跨地域公网:单向 60ms ±10ms,约增加 120ms RTT,丢包 0.1%,50mbit" \ "$BASE_PAYLOAD_BYTES" 8 16 48 4 15000 17000 false shape_rpc_ports delay 120ms 40ms distribution normal loss 1% rate 5mbit -run_scenario "network" "network-weak-mobile" \ - "nacos" "grpc" "protobuf" "tc weak/mobile: 120ms +/-40ms one-way, ~240ms added RTT, 1% loss, 5mbit" \ +run_scenario "网络" "network-weak-mobile" \ + "nacos" "grpc" "protobuf" "tc 弱网/移动网络:单向 120ms ±40ms,约增加 240ms RTT,丢包 1%,5mbit" \ "$BASE_PAYLOAD_BYTES" 6 12 36 3 20000 22000 false -# Protocol matrix runs last so a currently broken protocol cannot hide the baseline/network/serializer data. +# 协议矩阵放在最后,避免单个异常协议遮住其它维度数据。 apply_lan_profile for protocol in netty http http2; do - run_scenario "protocol" "protocol-${protocol}" \ - "nacos" "$protocol" "protobuf" "tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit" \ + run_scenario "协议" "protocol-${protocol}" \ + "nacos" "$protocol" "protobuf" "tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit" \ "$BASE_PAYLOAD_BYTES" 10 20 60 4 10000 12000 true done reset_network MATRIX_FILE="$MATRIX_DIR/matrix.md" +SHORT_SHA="${GITHUB_SHA:-local}" +SHORT_SHA="${SHORT_SHA:0:7}" +REPORT_DATE_UTC="${REPORT_RUN_TIME_UTC:0:10}" +REPORT_CLOCK_UTC="${REPORT_RUN_TIME_UTC:11:8}" +REPORT_CLOCK_UTC="${REPORT_CLOCK_UTC//:/-}" +REPORT_RELATIVE_PATH="docs/performance/${REPORT_DATE_UTC}/${REPORT_DATE_UTC}_${REPORT_CLOCK_UTC}Z_${SHORT_SHA}.md" + { - echo "## CI Matrix — $(date -u '+%Y-%m-%d %H:%M:%S UTC') — \`${GITHUB_SHA:-local}\`" + echo "# RPC CI 性能矩阵报告" echo - echo "- Runner: \`${RUNNER_OS:-local} ${RUNNER_ARCH:-unknown}\`" - echo "- Java: \`$(java -version 2>&1 | head -n 1 | tr -d '"')\`" - echo "- CPU visible: \`$(nproc)\`" - echo "- Baseline: \`gRPC + Nacos + Protobuf + 1 KiB + tc LAN\`" - echo "- Strategy: orthogonal matrix around the production-like baseline; Local Registry is a control only" - echo "- Network simulation: Linux \`tc netem\` on \`lo\`, filtered to reserved RPC ports \`$((RPC_PORT_START + 1))-$RPC_PORT_END\` only" - echo "- Nacos isolation: every scenario gets a unique RPC ip:port instance identity" - echo "- Coverage instrumentation: disabled for performance scenarios" - echo "- Scenario failures: \`$scenario_failures\`" + echo "- 运行时间(UTC):\`$REPORT_RUN_TIME_UTC\`" + echo "- 提交:\`${GITHUB_SHA:-local}\`" + echo "- Runner:\`${RUNNER_OS:-local} ${RUNNER_ARCH:-unknown}\`" + echo "- Java:\`$(java -version 2>&1 | head -n 1 | tr -d '"')\`" + echo "- 可用 CPU:\`$(nproc)\`" + echo "- 生产基线:\`gRPC + Nacos + Protobuf + 1 KiB + tc 内网\`" + echo "- 测试策略:围绕生产基线做正交矩阵,一次只改变一个主要变量;Local Registry 仅作对照" + echo "- 网络模拟:Linux \`tc netem\` 作用于 \`lo\`,仅过滤预留 RPC 端口 \`$((RPC_PORT_START + 1))-$RPC_PORT_END\`" + echo "- Nacos 隔离:每个场景使用独立 RPC ip:port 实例身份" + echo "- 覆盖率插桩:性能场景关闭 JaCoCo" + echo "- 失败场景数:\`$scenario_failures\`" echo cat "$MATRIX_DIR"/[0-9][0-9]-*.md } > "$MATRIX_FILE" +cat > "$MATRIX_DIR/report-meta.env" <&2 + echo "$scenario_failures 个性能场景失败;诊断数据已完整生成。" >&2 exit 1 fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa27e0c..9a04539 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,7 @@ on: branches: [ main ] paths-ignore: - 'docs/PERFORMANCE.md' + - 'docs/performance/**' pull_request: branches: [ main ] @@ -97,6 +98,8 @@ jobs: timeout-minutes: 35 outputs: performance_markdown: ${{ steps.performance-record.outputs.markdown }} + report_path: ${{ steps.performance-record.outputs.report_path }} + report_time_utc: ${{ steps.performance-record.outputs.report_time_utc }} steps: - name: Checkout code uses: actions/checkout@v7 @@ -121,10 +124,22 @@ jobs: shell: bash run: | matrix='rpc-consumer/target/performance-matrix/matrix.md' + meta='rpc-consumer/target/performance-matrix/report-meta.env' if [[ ! -s "$matrix" ]]; then - echo 'Performance matrix file was not produced.' >&2 + echo '没有生成性能矩阵报告。' >&2 exit 1 fi + if [[ ! -s "$meta" ]]; then + echo '没有生成性能报告元数据。' >&2 + exit 1 + fi + source "$meta" + case "$REPORT_RELATIVE_PATH" in + docs/performance/*.md) ;; + *) echo "非法性能报告路径: $REPORT_RELATIVE_PATH" >&2; exit 1 ;; + esac + echo "report_path=$REPORT_RELATIVE_PATH" >> "$GITHUB_OUTPUT" + echo "report_time_utc=$REPORT_RUN_TIME_UTC" >> "$GITHUB_OUTPUT" delimiter="RPC_PERFORMANCE_${GITHUB_RUN_ID}_${GITHUB_RUN_ATTEMPT}" { echo "markdown<<${delimiter}" @@ -165,30 +180,39 @@ jobs: with: ref: main fetch-depth: 0 - - name: Append performance matrix + - name: Write standalone performance report shell: bash env: PERFORMANCE_MARKDOWN: ${{ needs.performance-matrix.outputs.performance_markdown }} + REPORT_PATH: ${{ needs.performance-matrix.outputs.report_path }} + REPORT_TIME_UTC: ${{ needs.performance-matrix.outputs.report_time_utc }} run: | test -n "$PERFORMANCE_MARKDOWN" + test -n "$REPORT_PATH" + test -n "$REPORT_TIME_UTC" + case "$REPORT_PATH" in + docs/performance/*.md) ;; + *) echo "非法性能报告路径: $REPORT_PATH" >&2; exit 1 ;; + esac git pull --ff-only origin main - mkdir -p docs - test -f docs/PERFORMANCE.md - { - echo - echo '---' - echo - printf '%s\n' "$PERFORMANCE_MARKDOWN" - } >> docs/PERFORMANCE.md - - name: Commit performance history + mkdir -p "$(dirname "$REPORT_PATH")" + if [[ -e "$REPORT_PATH" ]]; then + echo "性能报告已存在,不允许覆盖: $REPORT_PATH" >&2 + exit 1 + fi + printf '%s\n' "$PERFORMANCE_MARKDOWN" > "$REPORT_PATH" + echo "已生成独立性能报告: $REPORT_PATH" + - name: Commit performance report shell: bash + env: + REPORT_PATH: ${{ needs.performance-matrix.outputs.report_path }} run: | git config user.name 'github-actions[bot]' git config user.email '41898282+github-actions[bot]@users.noreply.github.com' - git add docs/PERFORMANCE.md + git add "$REPORT_PATH" if git diff --cached --quiet; then - echo "No performance history change." + echo "没有新的性能报告。" exit 0 fi - git commit -m 'docs: record RPC performance matrix [skip ci]' + git commit -m 'docs: 记录 RPC 性能测试报告 [skip ci]' git push origin HEAD:main diff --git a/docs/PERFORMANCE.md b/docs/PERFORMANCE.md index 49f84ec..9ea59fe 100644 --- a/docs/PERFORMANCE.md +++ b/docs/PERFORMANCE.md @@ -1,725 +1,109 @@ -# RPC Performance History +# RPC 性能测试说明 -该文档由 CI 持续维护,用于记录 Java-RPC 真实端到端调用链路在不同协议、序列化器、注册中心、payload 和网络条件下的性能数据。 +本页只说明 Java-RPC 的 CI 性能测试规则、基线和报告存储方式,**不再持续追加每次运行的数据**。 -> 数据来自 GitHub Hosted Runner,适合比较实现差异、观察趋势和发现明显回归,不作为绝对性能承诺或硬性合并门槛。CI 使用以生产常见组合为中心的正交矩阵:一次只改变一个主要变量,避免全笛卡尔积既昂贵又难解释。 +性能数据来自 GitHub Hosted Runner,用于比较实现差异、观察趋势和发现明显回归,不代表生产环境绝对性能,也不作为固定 SLA。 -## CI 性能矩阵 +## 报告存储方式 -### 生产基线 +每次 `main` CI 的 Build、Unit Tests、RPC Integration、RPC Performance Matrix 和 CI Gate 全部成功后,CI 会创建一份新的独立 Markdown 报告: -默认基线不再使用 Local Registry 或裸 loopback,而是: +```text +docs/performance/YYYY-MM-DD/YYYY-MM-DD_HH-MM-SSZ_.md +``` -- Protocol: `grpc` -- Registry: `nacos`(CI 启动真实 `nacos/nacos-server:v2.5.4`) -- Serializer: `protobuf` -- Request payload: `1 KiB` -- Network: Linux `tc netem` 模拟内网:`delay 1ms ± 0.2ms` + `rate 1gbit` +例如: -`tc` 只过滤固定 RPC 数据端口 `19090`,不会把 Nacos 的 `8848/9848/9849` 控制面流量一起塑形,因此 RPC 数据面的网络差异不会被注册中心心跳/发现请求混入。 +```text +docs/performance/2026-09-14/2026-09-14_10-58-02Z_75070ff.md +``` -由于请求和响应都会经过 loopback 的 egress qdisc,文档中的 `tc delay` 可理解为单向注入值,RPC 请求/响应增加的 RTT 通常约为其两倍,再叠加框架处理时间。例如 `delay 25ms` 的场景大致增加约 `50ms` RTT。这里的网络档位是稳定、可复现的合成条件,不声称精确代表某个云厂商或运营商 SLA。 +时间统一使用 **UTC**,文件时间取本次性能矩阵开始运行的时间。同一次运行只写一个报告文件,历史报告不会被覆盖,也不会再把所有结果堆进本页。 + +[浏览性能报告目录](./performance/) + +早期没有保存精确运行时间的旧数据放在 `docs/performance/legacy/`,不会为了统一命名而伪造时间。 + +## 固定报告模板 + +每份独立报告使用同一套中文模板,包含: + +- 运行时间、提交 SHA、Runner、Java、CPU +- 生产基线和测试策略 +- 每个场景的注册中心、协议、序列化器、请求载荷和网络环境 +- 尝试数、成功数、失败数、成功率 +- 尝试吞吐和成功吞吐 +- 成功 RPC 的平均延迟、P50、P95、P99、最大延迟 +- Client / Server 的 total、success、failed、timeout、active 指标 + +## 生产基线 + +默认基线为: + +- 协议:`grpc` +- 注册中心:`nacos`(CI 启动真实 `nacos/nacos-server:v2.5.4`) +- 序列化器:`protobuf` +- 请求载荷:`1 KiB` +- 网络:Linux `tc netem` 模拟内网,单向 `1ms ± 0.2ms`,约增加 `2ms RTT`,`1gbit` + +Local Registry 只作为对照,不作为默认性能基线。 + +## 正交性能矩阵 + +矩阵围绕生产基线一次只改变一个主要变量,避免做昂贵且难解释的全笛卡尔积。 ### 协议 -固定 `Nacos + Protobuf + 1 KiB + tc LAN`: +固定 `Nacos + Protobuf + 1 KiB + tc 内网`: -- `grpc`(baseline) +- `grpc`(基线) - `netty` - `http` - `http2` -### 序列化 +### 序列化器 -固定 `gRPC + Nacos + 1 KiB + tc LAN`: +固定 `gRPC + Nacos + 1 KiB + tc 内网`: -- `protobuf`(baseline) +- `protobuf`(基线) - `kryo` - `java` - `json` ### 注册中心 -固定 `gRPC + Protobuf + 1 KiB + tc LAN`: +固定 `gRPC + Protobuf + 1 KiB + tc 内网`: -- `nacos`(baseline,真实 Docker) -- `local`(仅作为 control,不再作为默认基线) +- `nacos`(基线,真实 Docker) +- `local`(仅作对照) -### Payload +### 请求载荷 -固定 `gRPC + Nacos + Protobuf + tc LAN`: +固定 `gRPC + Nacos + Protobuf + tc 内网`: - `64 B` -- `1 KiB`(baseline) +- `1 KiB`(基线) - `16 KiB` - `256 KiB` -这样可以区分协议/序列化固定开销与数据量扩大后的拷贝、编码和带宽成本。 +### 网络环境 -### 网络 +固定 `gRPC + Nacos + Protobuf + 1 KiB`,`tc` 只塑形 RPC 数据端口,不影响 Nacos 的 `8848/9848/9849` 控制面流量。 -固定 `gRPC + Nacos + Protobuf + 1 KiB`,只塑形 RPC 端口: +| 网络环境 | 单向附加延迟 / 抖动 | 名义附加 RTT | 丢包 | 限速 | +| --- | --- | --- | --- | --- | +| 内网 | `1ms ± 0.2ms` | 约 `2ms` | 0 | `1gbit` | +| 跨 AZ / 私网 | `3ms ± 1ms` | 约 `6ms` | 0 | `500mbit` | +| 普通公网 | `25ms ± 5ms` | 约 `50ms` | `0.05%` | `100mbit` | +| 跨地域公网 | `60ms ± 10ms` | 约 `120ms` | `0.1%` | `50mbit` | +| 弱网 / 移动网络 | `120ms ± 40ms` | 约 `240ms` | `1%` | `5mbit` | -- 内网 LAN(baseline):`delay 1ms ± 0.2ms`,约 `2ms` added RTT,`1gbit` -- 跨 AZ / 私网:`delay 3ms ± 1ms`,约 `6ms` added RTT,`500mbit` -- 普通公网:`delay 25ms ± 5ms`,约 `50ms` added RTT,`loss 0.05%`,`100mbit` -- 跨地域公网:`delay 60ms ± 10ms`,约 `120ms` added RTT,`loss 0.1%`,`50mbit` -- 弱网 / 移动网络:`delay 120ms ± 40ms`,约 `240ms` added RTT,`loss 1%`,`5mbit` - -公网、跨地域和弱网场景允许出现真实 RPC 失败,不再以“必须 100% 成功”作为采样前提;报告会继续跑完整个阶段并记录成功率、failed、timeout、成功吞吐与成功请求的 P95/P99。至少需要保留成功样本,否则该场景仍判定失败。 +这些是为了可重复比较而设置的合成网络条件,不代表某个云厂商或运营商的真实 SLA。 ## 测量约束 -性能 job 与覆盖率 job 分离:性能矩阵显式关闭 JaCoCo,避免 coverage instrumentation 污染延迟与吞吐。性能 JVM 使用低日志配置,避免逐请求 INFO 输出成为热路径瓶颈;普通单元测试和覆盖率仍按原 CI 配置执行。 - -矩阵采用“围绕生产基线一次只改变一个主要变量”的策略。某个协议如果失败,脚本不会立即停止整个矩阵,而是把该场景标记为 FAIL 后继续运行剩余场景,最后再统一让 job 失败。这样一个坏模式不会遮住其他协议、序列化器、Nacos 或网络档位的数据。 - -## 记录指标 - -每个场景都会记录: - -- 尝试请求数、成功数、失败数、成功率 -- Attempt throughput 与 successful throughput -- 成功 RPC 的 Avg / P50 / P95 / P99 / Max latency -- Client / Server 的 total、success、failed、timeout、active -- Client / Server 内置 metric 的平均与最大耗时 -- Registry / Protocol / Serializer / Payload / Network profile -- Java / CPU / Runner 信息 - -PR CI 会执行完整矩阵作为验证;只有 `main` CI 全绿后才自动把矩阵结果追加到本文档。 - -## 历史记录 - -### PR #11 CI 单一基线(矩阵启用前) - -- Commit: `281d526ebe6ccd0e970453fc9094b85bf08cfe96` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` -- Registry / Protocol / Serializer: `local / netty / kryo` -- Network: loopback - -| Phase | Requests | Concurrency | Throughput req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 200 | 1 | 482.033 | 2.066 | 1.535 | 4.578 | 6.195 | 9.340 | -| concurrent | 1000 | 16 | 1537.520 | 10.250 | 9.376 | 17.876 | 22.806 | 27.916 | - -
Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 200 | 200 | 0 | 0 | 0 | 1.832 | 7.988 | -| sequential | SERVER | 200 | 200 | 0 | 0 | 0 | 0.240 | 3.970 | -| concurrent | CLIENT | 1000 | 1000 | 0 | 0 | 0 | 9.692 | 25.216 | -| concurrent | SERVER | 1000 | 1000 | 0 | 0 | 0 | 0.661 | 12.092 | - -
- ---- - -## CI Snapshot — 2026-09-14 09:14:08 UTC — `c525edb` - -- Commit: `c525edb58daffb37267b544e5928f0fb4db5ab49` -- Protocol: `netty` -- Serializer: `kryo` -- Registry: `local` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Requests | Concurrency | Throughput req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 200 | 1 | 590.543 | 1.684 | 1.402 | 3.225 | 4.610 | 5.836 | -| concurrent | 1000 | 16 | 1770.056 | 8.788 | 8.113 | 13.603 | 19.342 | 25.953 | - -### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 200 | 200 | 0 | 0 | 0 | 1.463 | 4.700 | -| sequential | SERVER | 200 | 200 | 0 | 0 | 0 | 0.190 | 2.493 | -| concurrent | CLIENT | 1000 | 1000 | 0 | 0 | 0 | 8.364 | 20.758 | -| concurrent | SERVER | 1000 | 1000 | 0 | 0 | 0 | 0.791 | 5.687 | - ---- +性能 job 与覆盖率 job 分离,性能矩阵显式关闭 JaCoCo,并使用低日志配置减少测试框架自身对延迟和吞吐的影响。 -## CI Matrix — 2026-09-14 11:23:30 UTC — `fc639de74af8fbb3c874307b93ac81e7ca81406a` +Nacos 服务可见性轮询和 warmup 不计入 RPC 性能计时。公网、跨地域和弱网场景允许出现真实失败,报告会继续记录成功率、失败数、超时数、成功吞吐以及成功请求的 P95/P99;数据损坏仍会直接判定为测试失败。 -- Runner: `Linux X64` -- Java: `openjdk version 17.0.20.1 2026-08-18` -- CPU visible: `4` -- Baseline: `gRPC + Nacos + Protobuf + 1 KiB + tc LAN` -- Strategy: orthogonal matrix around the production-like baseline; Local Registry is a control only -- Network simulation: Linux `tc netem` on `lo`, filtered to reserved RPC ports `19091-19120` only -- Nacos isolation: every scenario gets a unique RPC ip:port instance identity -- Coverage instrumentation: disabled for performance scenarios -- Scenario failures: `0` - -### `baseline-grpc-protobuf-nacos-lan` - -- Status: PASS -- Matrix dimension: `baseline` -- Registry / Protocol / Serializer: `nacos / grpc / protobuf` -- Request payload: `1024 bytes` -- RPC port: `19091` -- Network profile: `tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit` -- Strict success requirement: `true` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `grpc` -- Serializer: `protobuf` -- Registry: `nacos` -- RPC port: `19091` -- Request payload: `1024 bytes` -- Require all requests to succeed: `true` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 40 | 40 | 0 | 100.000 | 1 | 245.311 | 245.311 | 4.055 | 3.879 | 5.224 | 5.285 | 5.285 | -| concurrent | 120 | 120 | 0 | 100.000 | 8 | 1061.807 | 1061.807 | 7.299 | 6.891 | 10.367 | 12.152 | 13.181 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 40 | 40 | 0 | 0 | 0 | 3.876 | 5.083 | -| sequential | SERVER | 40 | 40 | 0 | 0 | 0 | 0.143 | 0.334 | -| concurrent | CLIENT | 120 | 120 | 0 | 0 | 0 | 6.858 | 12.778 | -| concurrent | SERVER | 120 | 120 | 0 | 0 | 0 | 0.386 | 1.853 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `payload-64b` - -- Status: PASS -- Matrix dimension: `payload` -- Registry / Protocol / Serializer: `nacos / grpc / protobuf` -- Request payload: `64 bytes` -- RPC port: `19092` -- Network profile: `tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit` -- Strict success requirement: `true` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `grpc` -- Serializer: `protobuf` -- Registry: `nacos` -- RPC port: `19092` -- Request payload: `64 bytes` -- Require all requests to succeed: `true` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 20 | 20 | 0 | 100.000 | 1 | 233.029 | 233.029 | 4.270 | 4.121 | 5.013 | 5.217 | 5.217 | -| concurrent | 60 | 60 | 0 | 100.000 | 4 | 808.614 | 808.614 | 4.818 | 4.584 | 6.522 | 7.729 | 7.729 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 20 | 20 | 0 | 0 | 0 | 4.112 | 5.056 | -| sequential | SERVER | 20 | 20 | 0 | 0 | 0 | 0.134 | 0.379 | -| concurrent | CLIENT | 60 | 60 | 0 | 0 | 0 | 4.587 | 7.364 | -| concurrent | SERVER | 60 | 60 | 0 | 0 | 0 | 0.182 | 0.913 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `payload-16384b` - -- Status: PASS -- Matrix dimension: `payload` -- Registry / Protocol / Serializer: `nacos / grpc / protobuf` -- Request payload: `16384 bytes` -- RPC port: `19093` -- Network profile: `tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit` -- Strict success requirement: `true` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `grpc` -- Serializer: `protobuf` -- Registry: `nacos` -- RPC port: `19093` -- Request payload: `16384 bytes` -- Require all requests to succeed: `true` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 20 | 20 | 0 | 100.000 | 1 | 206.152 | 206.152 | 4.825 | 4.611 | 5.763 | 6.303 | 6.303 | -| concurrent | 60 | 60 | 0 | 100.000 | 4 | 587.677 | 587.677 | 6.539 | 6.389 | 8.267 | 8.552 | 8.552 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 20 | 20 | 0 | 0 | 0 | 4.614 | 6.099 | -| sequential | SERVER | 20 | 20 | 0 | 0 | 0 | 0.224 | 0.587 | -| concurrent | CLIENT | 60 | 60 | 0 | 0 | 0 | 6.222 | 8.331 | -| concurrent | SERVER | 60 | 60 | 0 | 0 | 0 | 0.297 | 1.048 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `payload-262144b` - -- Status: PASS -- Matrix dimension: `payload` -- Registry / Protocol / Serializer: `nacos / grpc / protobuf` -- Request payload: `262144 bytes` -- RPC port: `19094` -- Network profile: `tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit` -- Strict success requirement: `true` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `grpc` -- Serializer: `protobuf` -- Registry: `nacos` -- RPC port: `19094` -- Request payload: `262144 bytes` -- Require all requests to succeed: `true` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 20 | 20 | 0 | 100.000 | 1 | 33.174 | 33.174 | 30.013 | 29.828 | 31.512 | 32.121 | 32.121 | -| concurrent | 60 | 60 | 0 | 100.000 | 4 | 42.757 | 42.757 | 91.888 | 88.230 | 101.554 | 180.429 | 180.429 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 20 | 20 | 0 | 0 | 0 | 29.087 | 31.315 | -| sequential | SERVER | 20 | 20 | 0 | 0 | 0 | 1.052 | 1.514 | -| concurrent | CLIENT | 60 | 60 | 0 | 0 | 0 | 90.633 | 176.256 | -| concurrent | SERVER | 60 | 60 | 0 | 0 | 0 | 1.611 | 7.982 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `serializer-kryo` - -- Status: PASS -- Matrix dimension: `serializer` -- Registry / Protocol / Serializer: `nacos / grpc / kryo` -- Request payload: `1024 bytes` -- RPC port: `19095` -- Network profile: `tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit` -- Strict success requirement: `true` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `grpc` -- Serializer: `kryo` -- Registry: `nacos` -- RPC port: `19095` -- Request payload: `1024 bytes` -- Require all requests to succeed: `true` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 20 | 20 | 0 | 100.000 | 1 | 215.887 | 215.887 | 4.611 | 4.573 | 5.264 | 5.660 | 5.660 | -| concurrent | 60 | 60 | 0 | 100.000 | 4 | 701.058 | 701.058 | 5.514 | 5.291 | 7.799 | 8.663 | 8.663 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 20 | 20 | 0 | 0 | 0 | 4.393 | 5.431 | -| sequential | SERVER | 20 | 20 | 0 | 0 | 0 | 0.271 | 0.514 | -| concurrent | CLIENT | 60 | 60 | 0 | 0 | 0 | 5.105 | 8.467 | -| concurrent | SERVER | 60 | 60 | 0 | 0 | 0 | 0.230 | 1.100 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `serializer-java` - -- Status: PASS -- Matrix dimension: `serializer` -- Registry / Protocol / Serializer: `nacos / grpc / java` -- Request payload: `1024 bytes` -- RPC port: `19096` -- Network profile: `tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit` -- Strict success requirement: `true` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `grpc` -- Serializer: `java` -- Registry: `nacos` -- RPC port: `19096` -- Request payload: `1024 bytes` -- Require all requests to succeed: `true` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 20 | 20 | 0 | 100.000 | 1 | 228.861 | 228.861 | 4.348 | 4.379 | 4.741 | 5.202 | 5.202 | -| concurrent | 60 | 60 | 0 | 100.000 | 4 | 613.836 | 613.836 | 6.211 | 5.869 | 8.690 | 9.738 | 9.738 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 20 | 20 | 0 | 0 | 0 | 4.102 | 4.915 | -| sequential | SERVER | 20 | 20 | 0 | 0 | 0 | 0.283 | 0.557 | -| concurrent | CLIENT | 60 | 60 | 0 | 0 | 0 | 5.792 | 9.155 | -| concurrent | SERVER | 60 | 60 | 0 | 0 | 0 | 0.357 | 1.962 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `serializer-json` - -- Status: PASS -- Matrix dimension: `serializer` -- Registry / Protocol / Serializer: `nacos / grpc / json` -- Request payload: `1024 bytes` -- RPC port: `19097` -- Network profile: `tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit` -- Strict success requirement: `true` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `grpc` -- Serializer: `json` -- Registry: `nacos` -- RPC port: `19097` -- Request payload: `1024 bytes` -- Require all requests to succeed: `true` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 20 | 20 | 0 | 100.000 | 1 | 217.780 | 217.780 | 4.571 | 4.490 | 5.127 | 5.324 | 5.324 | -| concurrent | 60 | 60 | 0 | 100.000 | 4 | 688.900 | 688.900 | 5.658 | 5.577 | 7.143 | 8.124 | 8.124 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 20 | 20 | 0 | 0 | 0 | 4.375 | 5.095 | -| sequential | SERVER | 20 | 20 | 0 | 0 | 0 | 0.316 | 0.697 | -| concurrent | CLIENT | 60 | 60 | 0 | 0 | 0 | 5.289 | 7.220 | -| concurrent | SERVER | 60 | 60 | 0 | 0 | 0 | 0.281 | 1.508 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `registry-local-control` - -- Status: PASS -- Matrix dimension: `registry` -- Registry / Protocol / Serializer: `local / grpc / protobuf` -- Request payload: `1024 bytes` -- RPC port: `19098` -- Network profile: `tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit` -- Strict success requirement: `true` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `grpc` -- Serializer: `protobuf` -- Registry: `local` -- RPC port: `19098` -- Request payload: `1024 bytes` -- Require all requests to succeed: `true` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 20 | 20 | 0 | 100.000 | 1 | 217.893 | 217.893 | 4.567 | 4.404 | 5.474 | 6.637 | 6.637 | -| concurrent | 60 | 60 | 0 | 100.000 | 4 | 608.896 | 608.896 | 6.407 | 6.201 | 9.295 | 10.269 | 10.269 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 20 | 20 | 0 | 0 | 0 | 4.365 | 6.304 | -| sequential | SERVER | 20 | 20 | 0 | 0 | 0 | 0.201 | 0.604 | -| concurrent | CLIENT | 60 | 60 | 0 | 0 | 0 | 5.959 | 9.312 | -| concurrent | SERVER | 60 | 60 | 0 | 0 | 0 | 0.285 | 2.782 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `network-cross-az` - -- Status: PASS -- Matrix dimension: `network` -- Registry / Protocol / Serializer: `nacos / grpc / protobuf` -- Request payload: `1024 bytes` -- RPC port: `19099` -- Network profile: `tc cross-AZ/private: 3ms +/-1ms one-way, ~6ms added RTT, 500mbit` -- Strict success requirement: `true` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `grpc` -- Serializer: `protobuf` -- Registry: `nacos` -- RPC port: `19099` -- Request payload: `1024 bytes` -- Require all requests to succeed: `true` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 20 | 20 | 0 | 100.000 | 1 | 119.204 | 119.204 | 8.364 | 8.434 | 9.806 | 9.959 | 9.959 | -| concurrent | 60 | 60 | 0 | 100.000 | 4 | 421.090 | 421.090 | 9.349 | 9.229 | 12.427 | 12.709 | 12.709 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 20 | 20 | 0 | 0 | 0 | 8.160 | 9.663 | -| sequential | SERVER | 20 | 20 | 0 | 0 | 0 | 0.194 | 0.475 | -| concurrent | CLIENT | 60 | 60 | 0 | 0 | 0 | 9.115 | 12.498 | -| concurrent | SERVER | 60 | 60 | 0 | 0 | 0 | 0.220 | 1.438 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `network-public-internet` - -- Status: PASS -- Matrix dimension: `network` -- Registry / Protocol / Serializer: `nacos / grpc / protobuf` -- Request payload: `1024 bytes` -- RPC port: `19100` -- Network profile: `tc public internet: 25ms +/-5ms one-way, ~50ms added RTT, 0.05% loss, 100mbit` -- Strict success requirement: `false` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `grpc` -- Serializer: `protobuf` -- Registry: `nacos` -- RPC port: `19100` -- Request payload: `1024 bytes` -- Require all requests to succeed: `false` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 20 | 20 | 0 | 100.000 | 1 | 19.130 | 19.130 | 52.233 | 52.526 | 62.168 | 66.551 | 66.551 | -| concurrent | 60 | 60 | 0 | 100.000 | 4 | 64.913 | 64.913 | 60.299 | 60.200 | 73.189 | 75.444 | 75.444 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 20 | 20 | 0 | 0 | 0 | 51.976 | 66.280 | -| sequential | SERVER | 20 | 20 | 0 | 0 | 0 | 0.266 | 0.528 | -| concurrent | CLIENT | 60 | 60 | 0 | 0 | 0 | 60.088 | 75.279 | -| concurrent | SERVER | 60 | 60 | 0 | 0 | 0 | 0.162 | 0.580 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `network-cross-region` - -- Status: PASS -- Matrix dimension: `network` -- Registry / Protocol / Serializer: `nacos / grpc / protobuf` -- Request payload: `1024 bytes` -- RPC port: `19101` -- Network profile: `tc cross-region: 60ms +/-10ms one-way, ~120ms added RTT, 0.1% loss, 50mbit` -- Strict success requirement: `false` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `grpc` -- Serializer: `protobuf` -- Registry: `nacos` -- RPC port: `19101` -- Request payload: `1024 bytes` -- Require all requests to succeed: `false` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 16 | 16 | 0 | 100.000 | 1 | 8.153 | 8.153 | 122.599 | 123.710 | 144.924 | 144.924 | 144.924 | -| concurrent | 48 | 48 | 0 | 100.000 | 4 | 28.300 | 28.300 | 136.180 | 135.239 | 159.815 | 165.190 | 165.190 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 16 | 16 | 0 | 0 | 0 | 122.280 | 144.704 | -| sequential | SERVER | 16 | 16 | 0 | 0 | 0 | 0.302 | 0.500 | -| concurrent | CLIENT | 48 | 48 | 0 | 0 | 0 | 135.921 | 164.986 | -| concurrent | SERVER | 48 | 48 | 0 | 0 | 0 | 0.216 | 1.037 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `network-weak-mobile` - -- Status: PASS -- Matrix dimension: `network` -- Registry / Protocol / Serializer: `nacos / grpc / protobuf` -- Request payload: `1024 bytes` -- RPC port: `19102` -- Network profile: `tc weak/mobile: 120ms +/-40ms one-way, ~240ms added RTT, 1% loss, 5mbit` -- Strict success requirement: `false` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `grpc` -- Serializer: `protobuf` -- Registry: `nacos` -- RPC port: `19102` -- Request payload: `1024 bytes` -- Require all requests to succeed: `false` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 12 | 12 | 0 | 100.000 | 1 | 4.354 | 4.354 | 229.611 | 238.054 | 329.140 | 329.140 | 329.140 | -| concurrent | 36 | 36 | 0 | 100.000 | 3 | 8.877 | 8.877 | 336.140 | 308.474 | 577.337 | 812.470 | 812.470 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 12 | 12 | 0 | 0 | 0 | 229.269 | 328.738 | -| sequential | SERVER | 12 | 12 | 0 | 0 | 0 | 0.347 | 0.573 | -| concurrent | CLIENT | 36 | 36 | 0 | 0 | 0 | 335.817 | 812.307 | -| concurrent | SERVER | 36 | 36 | 0 | 0 | 0 | 0.192 | 0.560 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `protocol-netty` - -- Status: PASS -- Matrix dimension: `protocol` -- Registry / Protocol / Serializer: `nacos / netty / protobuf` -- Request payload: `1024 bytes` -- RPC port: `19103` -- Network profile: `tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit` -- Strict success requirement: `true` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `netty` -- Serializer: `protobuf` -- Registry: `nacos` -- RPC port: `19103` -- Request payload: `1024 bytes` -- Require all requests to succeed: `true` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 20 | 20 | 0 | 100.000 | 1 | 294.823 | 294.823 | 3.372 | 3.172 | 4.443 | 4.883 | 4.883 | -| concurrent | 60 | 60 | 0 | 100.000 | 4 | 1115.842 | 1115.842 | 3.446 | 3.311 | 4.583 | 5.648 | 5.648 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 20 | 20 | 0 | 0 | 0 | 3.175 | 4.704 | -| sequential | SERVER | 20 | 20 | 0 | 0 | 0 | 0.188 | 0.380 | -| concurrent | CLIENT | 60 | 60 | 0 | 0 | 0 | 3.269 | 5.116 | -| concurrent | SERVER | 60 | 60 | 0 | 0 | 0 | 0.142 | 0.752 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `protocol-http` - -- Status: PASS -- Matrix dimension: `protocol` -- Registry / Protocol / Serializer: `nacos / http / protobuf` -- Request payload: `1024 bytes` -- RPC port: `19104` -- Network profile: `tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit` -- Strict success requirement: `true` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `http` -- Serializer: `protobuf` -- Registry: `nacos` -- RPC port: `19104` -- Request payload: `1024 bytes` -- Require all requests to succeed: `true` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 20 | 20 | 0 | 100.000 | 1 | 281.369 | 281.369 | 3.534 | 3.514 | 4.125 | 4.269 | 4.269 | -| concurrent | 60 | 60 | 0 | 100.000 | 4 | 931.229 | 931.229 | 4.158 | 4.074 | 5.229 | 5.509 | 5.509 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 20 | 20 | 0 | 0 | 0 | 3.373 | 4.003 | -| sequential | SERVER | 20 | 20 | 0 | 0 | 0 | 0.151 | 0.308 | -| concurrent | CLIENT | 60 | 60 | 0 | 0 | 0 | 3.938 | 5.232 | -| concurrent | SERVER | 60 | 60 | 0 | 0 | 0 | 0.156 | 0.660 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. -### `protocol-http2` - -- Status: PASS -- Matrix dimension: `protocol` -- Registry / Protocol / Serializer: `nacos / http2 / protobuf` -- Request payload: `1024 bytes` -- RPC port: `19105` -- Network profile: `tc LAN: 1ms +/-0.2ms one-way, ~2ms added RTT, 1gbit` -- Strict success requirement: `true` - - - -- Commit: `fc639de74af8fbb3c874307b93ac81e7ca81406a` -- Protocol: `http2` -- Serializer: `protobuf` -- Registry: `nacos` -- RPC port: `19105` -- Request payload: `1024 bytes` -- Require all requests to succeed: `true` -- Java: `17.0.20.1` -- CPU visible to JVM: `4` - -| Phase | Attempts | Success | Failed | Success % | Concurrency | Attempt req/s | Success req/s | Avg ms | P50 ms | P95 ms | P99 ms | Max ms | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | 20 | 20 | 0 | 100.000 | 1 | 211.683 | 211.683 | 4.702 | 4.595 | 5.372 | 5.747 | 5.747 | -| concurrent | 60 | 60 | 0 | 100.000 | 4 | 522.647 | 522.647 | 7.404 | 7.213 | 10.388 | 12.085 | 12.085 | - -#### Framework metrics - -| Phase | Side | Total | Success | Failed | Timeout | Active | Metric avg ms | Metric max ms | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| sequential | CLIENT | 20 | 20 | 0 | 0 | 0 | 4.496 | 5.575 | -| sequential | SERVER | 20 | 20 | 0 | 0 | 0 | 0.175 | 0.308 | -| concurrent | CLIENT | 60 | 60 | 0 | 0 | 0 | 6.950 | 11.932 | -| concurrent | SERVER | 60 | 60 | 0 | 0 | 0 | 0.514 | 3.268 | - -Latency percentiles include successful RPCs only. Low sample counts do not establish a reliable tail-latency SLA. -Nacos visibility polling and warmup are excluded from timing. In lossy profiles, server observation intervals may include late requests. +P95/P99 只统计成功请求,小样本不能用于推导生产 SLA。当前网络模拟仍发生在同一 GitHub Runner 的真实 TCP loopback 上,不等价于跨物理主机或真实公网压测。 diff --git a/docs/performance/2026-09-14/2026-09-14_09-14-08Z_c525edb.md b/docs/performance/2026-09-14/2026-09-14_09-14-08Z_c525edb.md new file mode 100644 index 0000000..f077370 --- /dev/null +++ b/docs/performance/2026-09-14/2026-09-14_09-14-08Z_c525edb.md @@ -0,0 +1,28 @@ +# RPC CI 性能报告 + +- 运行时间(UTC):`2026-09-14T09:14:08Z` +- 提交:`c525edb58daffb37267b544e5928f0fb4db5ab49` +- 协议:`netty` +- 序列化器:`kryo` +- 注册中心:`local` +- 网络环境:`loopback` +- Java:`17.0.20.1` +- JVM 可见 CPU:`4` + +> 该报告来自性能矩阵启用前的单一基线测试,仅用于保留历史数据,不能与当前生产型矩阵做严格一一对比。 + +## RPC 性能 + +| 阶段 | 请求数 | 并发度 | 吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 200 | 1 | 590.543 | 1.684 | 1.402 | 3.225 | 4.610 | 5.836 | +| 并发调用 | 1000 | 16 | 1770.056 | 8.788 | 8.113 | 13.603 | 19.342 | 25.953 | + +## 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 200 | 200 | 0 | 0 | 0 | 1.463 | 4.700 | +| 顺序调用 | 服务端 | 200 | 200 | 0 | 0 | 0 | 0.190 | 2.493 | +| 并发调用 | 客户端 | 1000 | 1000 | 0 | 0 | 0 | 8.364 | 20.758 | +| 并发调用 | 服务端 | 1000 | 1000 | 0 | 0 | 0 | 0.791 | 5.687 | diff --git a/docs/performance/2026-09-14/2026-09-14_11-23-30Z_fc639de.md b/docs/performance/2026-09-14/2026-09-14_11-23-30Z_fc639de.md new file mode 100644 index 0000000..6a0e463 --- /dev/null +++ b/docs/performance/2026-09-14/2026-09-14_11-23-30Z_fc639de.md @@ -0,0 +1,375 @@ +# RPC CI 性能矩阵报告 + +- 运行时间(UTC):`2026-09-14T11:23:30Z` +- 提交:`fc639de74af8fbb3c874307b93ac81e7ca81406a` +- Runner:`Linux X64` +- Java:`openjdk version 17.0.20.1 2026-08-18` +- 可用 CPU:`4` +- 生产基线:`gRPC + Nacos + Protobuf + 1 KiB + tc 内网` +- 测试策略:围绕生产基线做正交矩阵,一次只改变一个主要变量;Local Registry 仅作对照 +- 网络模拟:Linux `tc netem` 作用于 `lo`,仅过滤预留 RPC 端口 `19091-19120` +- Nacos 隔离:每个场景使用独立 RPC ip:port 实例身份 +- 覆盖率插桩:性能场景关闭 JaCoCo +- 失败场景数:`0` + +### 场景:`baseline-grpc-protobuf-nacos-lan` + +- 状态:通过 +- 矩阵维度:`基线` +- 注册中心 / 协议 / 序列化器:`nacos / grpc / protobuf` +- 请求载荷:`1024 bytes` +- RPC 端口:`19091` +- 网络环境:`tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit` +- 是否要求全部请求成功:`true` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 40 | 40 | 0 | 100.000 | 1 | 245.311 | 245.311 | 4.055 | 3.879 | 5.224 | 5.285 | 5.285 | +| 并发调用 | 120 | 120 | 0 | 100.000 | 8 | 1061.807 | 1061.807 | 7.299 | 6.891 | 10.367 | 12.152 | 13.181 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 40 | 40 | 0 | 0 | 0 | 3.876 | 5.083 | +| 顺序调用 | 服务端 | 40 | 40 | 0 | 0 | 0 | 0.143 | 0.334 | +| 并发调用 | 客户端 | 120 | 120 | 0 | 0 | 0 | 6.858 | 12.778 | +| 并发调用 | 服务端 | 120 | 120 | 0 | 0 | 0 | 0.386 | 1.853 | + +### 场景:`payload-64b` + +- 状态:通过 +- 矩阵维度:`请求载荷` +- 注册中心 / 协议 / 序列化器:`nacos / grpc / protobuf` +- 请求载荷:`64 bytes` +- RPC 端口:`19092` +- 网络环境:`tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit` +- 是否要求全部请求成功:`true` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 20 | 20 | 0 | 100.000 | 1 | 233.029 | 233.029 | 4.270 | 4.121 | 5.013 | 5.217 | 5.217 | +| 并发调用 | 60 | 60 | 0 | 100.000 | 4 | 808.614 | 808.614 | 4.818 | 4.584 | 6.522 | 7.729 | 7.729 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 20 | 20 | 0 | 0 | 0 | 4.112 | 5.056 | +| 顺序调用 | 服务端 | 20 | 20 | 0 | 0 | 0 | 0.134 | 0.379 | +| 并发调用 | 客户端 | 60 | 60 | 0 | 0 | 0 | 4.587 | 7.364 | +| 并发调用 | 服务端 | 60 | 60 | 0 | 0 | 0 | 0.182 | 0.913 | + +### 场景:`payload-16384b` + +- 状态:通过 +- 矩阵维度:`请求载荷` +- 注册中心 / 协议 / 序列化器:`nacos / grpc / protobuf` +- 请求载荷:`16384 bytes` +- RPC 端口:`19093` +- 网络环境:`tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit` +- 是否要求全部请求成功:`true` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 20 | 20 | 0 | 100.000 | 1 | 206.152 | 206.152 | 4.825 | 4.611 | 5.763 | 6.303 | 6.303 | +| 并发调用 | 60 | 60 | 0 | 100.000 | 4 | 587.677 | 587.677 | 6.539 | 6.389 | 8.267 | 8.552 | 8.552 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 20 | 20 | 0 | 0 | 0 | 4.614 | 6.099 | +| 顺序调用 | 服务端 | 20 | 20 | 0 | 0 | 0 | 0.224 | 0.587 | +| 并发调用 | 客户端 | 60 | 60 | 0 | 0 | 0 | 6.222 | 8.331 | +| 并发调用 | 服务端 | 60 | 60 | 0 | 0 | 0 | 0.297 | 1.048 | + +### 场景:`payload-262144b` + +- 状态:通过 +- 矩阵维度:`请求载荷` +- 注册中心 / 协议 / 序列化器:`nacos / grpc / protobuf` +- 请求载荷:`262144 bytes` +- RPC 端口:`19094` +- 网络环境:`tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit` +- 是否要求全部请求成功:`true` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 20 | 20 | 0 | 100.000 | 1 | 33.174 | 33.174 | 30.013 | 29.828 | 31.512 | 32.121 | 32.121 | +| 并发调用 | 60 | 60 | 0 | 100.000 | 4 | 42.757 | 42.757 | 91.888 | 88.230 | 101.554 | 180.429 | 180.429 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 20 | 20 | 0 | 0 | 0 | 29.087 | 31.315 | +| 顺序调用 | 服务端 | 20 | 20 | 0 | 0 | 0 | 1.052 | 1.514 | +| 并发调用 | 客户端 | 60 | 60 | 0 | 0 | 0 | 90.633 | 176.256 | +| 并发调用 | 服务端 | 60 | 60 | 0 | 0 | 0 | 1.611 | 7.982 | + +### 场景:`serializer-kryo` + +- 状态:通过 +- 矩阵维度:`序列化器` +- 注册中心 / 协议 / 序列化器:`nacos / grpc / kryo` +- 请求载荷:`1024 bytes` +- RPC 端口:`19095` +- 网络环境:`tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit` +- 是否要求全部请求成功:`true` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 20 | 20 | 0 | 100.000 | 1 | 215.887 | 215.887 | 4.611 | 4.573 | 5.264 | 5.660 | 5.660 | +| 并发调用 | 60 | 60 | 0 | 100.000 | 4 | 701.058 | 701.058 | 5.514 | 5.291 | 7.799 | 8.663 | 8.663 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 20 | 20 | 0 | 0 | 0 | 4.393 | 5.431 | +| 顺序调用 | 服务端 | 20 | 20 | 0 | 0 | 0 | 0.271 | 0.514 | +| 并发调用 | 客户端 | 60 | 60 | 0 | 0 | 0 | 5.105 | 8.467 | +| 并发调用 | 服务端 | 60 | 60 | 0 | 0 | 0 | 0.230 | 1.100 | + +### 场景:`serializer-java` + +- 状态:通过 +- 矩阵维度:`序列化器` +- 注册中心 / 协议 / 序列化器:`nacos / grpc / java` +- 请求载荷:`1024 bytes` +- RPC 端口:`19096` +- 网络环境:`tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit` +- 是否要求全部请求成功:`true` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 20 | 20 | 0 | 100.000 | 1 | 228.861 | 228.861 | 4.348 | 4.379 | 4.741 | 5.202 | 5.202 | +| 并发调用 | 60 | 60 | 0 | 100.000 | 4 | 613.836 | 613.836 | 6.211 | 5.869 | 8.690 | 9.738 | 9.738 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 20 | 20 | 0 | 0 | 0 | 4.102 | 4.915 | +| 顺序调用 | 服务端 | 20 | 20 | 0 | 0 | 0 | 0.283 | 0.557 | +| 并发调用 | 客户端 | 60 | 60 | 0 | 0 | 0 | 5.792 | 9.155 | +| 并发调用 | 服务端 | 60 | 60 | 0 | 0 | 0 | 0.357 | 1.962 | + +### 场景:`serializer-json` + +- 状态:通过 +- 矩阵维度:`序列化器` +- 注册中心 / 协议 / 序列化器:`nacos / grpc / json` +- 请求载荷:`1024 bytes` +- RPC 端口:`19097` +- 网络环境:`tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit` +- 是否要求全部请求成功:`true` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 20 | 20 | 0 | 100.000 | 1 | 217.780 | 217.780 | 4.571 | 4.490 | 5.127 | 5.324 | 5.324 | +| 并发调用 | 60 | 60 | 0 | 100.000 | 4 | 688.900 | 688.900 | 5.658 | 5.577 | 7.143 | 8.124 | 8.124 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 20 | 20 | 0 | 0 | 0 | 4.375 | 5.095 | +| 顺序调用 | 服务端 | 20 | 20 | 0 | 0 | 0 | 0.316 | 0.697 | +| 并发调用 | 客户端 | 60 | 60 | 0 | 0 | 0 | 5.289 | 7.220 | +| 并发调用 | 服务端 | 60 | 60 | 0 | 0 | 0 | 0.281 | 1.508 | + +### 场景:`registry-local-control` + +- 状态:通过 +- 矩阵维度:`注册中心` +- 注册中心 / 协议 / 序列化器:`local / grpc / protobuf` +- 请求载荷:`1024 bytes` +- RPC 端口:`19098` +- 网络环境:`tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit` +- 是否要求全部请求成功:`true` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 20 | 20 | 0 | 100.000 | 1 | 217.893 | 217.893 | 4.567 | 4.404 | 5.474 | 6.637 | 6.637 | +| 并发调用 | 60 | 60 | 0 | 100.000 | 4 | 608.896 | 608.896 | 6.407 | 6.201 | 9.295 | 10.269 | 10.269 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 20 | 20 | 0 | 0 | 0 | 4.365 | 6.304 | +| 顺序调用 | 服务端 | 20 | 20 | 0 | 0 | 0 | 0.201 | 0.604 | +| 并发调用 | 客户端 | 60 | 60 | 0 | 0 | 0 | 5.959 | 9.312 | +| 并发调用 | 服务端 | 60 | 60 | 0 | 0 | 0 | 0.285 | 2.782 | + +### 场景:`network-cross-az` + +- 状态:通过 +- 矩阵维度:`网络` +- 注册中心 / 协议 / 序列化器:`nacos / grpc / protobuf` +- 请求载荷:`1024 bytes` +- RPC 端口:`19099` +- 网络环境:`tc 跨 AZ/私网:单向 3ms ±1ms,约增加 6ms RTT,500mbit` +- 是否要求全部请求成功:`true` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 20 | 20 | 0 | 100.000 | 1 | 119.204 | 119.204 | 8.364 | 8.434 | 9.806 | 9.959 | 9.959 | +| 并发调用 | 60 | 60 | 0 | 100.000 | 4 | 421.090 | 421.090 | 9.349 | 9.229 | 12.427 | 12.709 | 12.709 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 20 | 20 | 0 | 0 | 0 | 8.160 | 9.663 | +| 顺序调用 | 服务端 | 20 | 20 | 0 | 0 | 0 | 0.194 | 0.475 | +| 并发调用 | 客户端 | 60 | 60 | 0 | 0 | 0 | 9.115 | 12.498 | +| 并发调用 | 服务端 | 60 | 60 | 0 | 0 | 0 | 0.220 | 1.438 | + +### 场景:`network-public-internet` + +- 状态:通过 +- 矩阵维度:`网络` +- 注册中心 / 协议 / 序列化器:`nacos / grpc / protobuf` +- 请求载荷:`1024 bytes` +- RPC 端口:`19100` +- 网络环境:`tc 普通公网:单向 25ms ±5ms,约增加 50ms RTT,丢包 0.05%,100mbit` +- 是否要求全部请求成功:`false` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 20 | 20 | 0 | 100.000 | 1 | 19.130 | 19.130 | 52.233 | 52.526 | 62.168 | 66.551 | 66.551 | +| 并发调用 | 60 | 60 | 0 | 100.000 | 4 | 64.913 | 64.913 | 60.299 | 60.200 | 73.189 | 75.444 | 75.444 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 20 | 20 | 0 | 0 | 0 | 51.976 | 66.280 | +| 顺序调用 | 服务端 | 20 | 20 | 0 | 0 | 0 | 0.266 | 0.528 | +| 并发调用 | 客户端 | 60 | 60 | 0 | 0 | 0 | 60.088 | 75.279 | +| 并发调用 | 服务端 | 60 | 60 | 0 | 0 | 0 | 0.162 | 0.580 | + +### 场景:`network-cross-region` + +- 状态:通过 +- 矩阵维度:`网络` +- 注册中心 / 协议 / 序列化器:`nacos / grpc / protobuf` +- 请求载荷:`1024 bytes` +- RPC 端口:`19101` +- 网络环境:`tc 跨地域公网:单向 60ms ±10ms,约增加 120ms RTT,丢包 0.1%,50mbit` +- 是否要求全部请求成功:`false` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 16 | 16 | 0 | 100.000 | 1 | 8.153 | 8.153 | 122.599 | 123.710 | 144.924 | 144.924 | 144.924 | +| 并发调用 | 48 | 48 | 0 | 100.000 | 4 | 28.300 | 28.300 | 136.180 | 135.239 | 159.815 | 165.190 | 165.190 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 16 | 16 | 0 | 0 | 0 | 122.280 | 144.704 | +| 顺序调用 | 服务端 | 16 | 16 | 0 | 0 | 0 | 0.302 | 0.500 | +| 并发调用 | 客户端 | 48 | 48 | 0 | 0 | 0 | 135.921 | 164.986 | +| 并发调用 | 服务端 | 48 | 48 | 0 | 0 | 0 | 0.216 | 1.037 | + +### 场景:`network-weak-mobile` + +- 状态:通过 +- 矩阵维度:`网络` +- 注册中心 / 协议 / 序列化器:`nacos / grpc / protobuf` +- 请求载荷:`1024 bytes` +- RPC 端口:`19102` +- 网络环境:`tc 弱网/移动网络:单向 120ms ±40ms,约增加 240ms RTT,丢包 1%,5mbit` +- 是否要求全部请求成功:`false` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 12 | 12 | 0 | 100.000 | 1 | 4.354 | 4.354 | 229.611 | 238.054 | 329.140 | 329.140 | 329.140 | +| 并发调用 | 36 | 36 | 0 | 100.000 | 3 | 8.877 | 8.877 | 336.140 | 308.474 | 577.337 | 812.470 | 812.470 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 12 | 12 | 0 | 0 | 0 | 229.269 | 328.738 | +| 顺序调用 | 服务端 | 12 | 12 | 0 | 0 | 0 | 0.347 | 0.573 | +| 并发调用 | 客户端 | 36 | 36 | 0 | 0 | 0 | 335.817 | 812.307 | +| 并发调用 | 服务端 | 36 | 36 | 0 | 0 | 0 | 0.192 | 0.560 | + +### 场景:`protocol-netty` + +- 状态:通过 +- 矩阵维度:`协议` +- 注册中心 / 协议 / 序列化器:`nacos / netty / protobuf` +- 请求载荷:`1024 bytes` +- RPC 端口:`19103` +- 网络环境:`tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit` +- 是否要求全部请求成功:`true` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 20 | 20 | 0 | 100.000 | 1 | 294.823 | 294.823 | 3.372 | 3.172 | 4.443 | 4.883 | 4.883 | +| 并发调用 | 60 | 60 | 0 | 100.000 | 4 | 1115.842 | 1115.842 | 3.446 | 3.311 | 4.583 | 5.648 | 5.648 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 20 | 20 | 0 | 0 | 0 | 3.175 | 4.704 | +| 顺序调用 | 服务端 | 20 | 20 | 0 | 0 | 0 | 0.188 | 0.380 | +| 并发调用 | 客户端 | 60 | 60 | 0 | 0 | 0 | 3.269 | 5.116 | +| 并发调用 | 服务端 | 60 | 60 | 0 | 0 | 0 | 0.142 | 0.752 | + +### 场景:`protocol-http` + +- 状态:通过 +- 矩阵维度:`协议` +- 注册中心 / 协议 / 序列化器:`nacos / http / protobuf` +- 请求载荷:`1024 bytes` +- RPC 端口:`19104` +- 网络环境:`tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit` +- 是否要求全部请求成功:`true` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 20 | 20 | 0 | 100.000 | 1 | 281.369 | 281.369 | 3.534 | 3.514 | 4.125 | 4.269 | 4.269 | +| 并发调用 | 60 | 60 | 0 | 100.000 | 4 | 931.229 | 931.229 | 4.158 | 4.074 | 5.229 | 5.509 | 5.509 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 20 | 20 | 0 | 0 | 0 | 3.373 | 4.003 | +| 顺序调用 | 服务端 | 20 | 20 | 0 | 0 | 0 | 0.151 | 0.308 | +| 并发调用 | 客户端 | 60 | 60 | 0 | 0 | 0 | 3.938 | 5.232 | +| 并发调用 | 服务端 | 60 | 60 | 0 | 0 | 0 | 0.156 | 0.660 | + +### 场景:`protocol-http2` + +- 状态:通过 +- 矩阵维度:`协议` +- 注册中心 / 协议 / 序列化器:`nacos / http2 / protobuf` +- 请求载荷:`1024 bytes` +- RPC 端口:`19105` +- 网络环境:`tc 内网:单向 1ms ±0.2ms,约增加 2ms RTT,1gbit` +- 是否要求全部请求成功:`true` + +| 阶段 | 尝试数 | 成功 | 失败 | 成功率 % | 并发度 | 尝试吞吐 req/s | 成功吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 20 | 20 | 0 | 100.000 | 1 | 211.683 | 211.683 | 4.702 | 4.595 | 5.372 | 5.747 | 5.747 | +| 并发调用 | 60 | 60 | 0 | 100.000 | 4 | 522.647 | 522.647 | 7.404 | 7.213 | 10.388 | 12.085 | 12.085 | + +#### 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 20 | 20 | 0 | 0 | 0 | 4.496 | 5.575 | +| 顺序调用 | 服务端 | 20 | 20 | 0 | 0 | 0 | 0.175 | 0.308 | +| 并发调用 | 客户端 | 60 | 60 | 0 | 0 | 0 | 6.950 | 11.932 | +| 并发调用 | 服务端 | 60 | 60 | 0 | 0 | 0 | 0.514 | 3.268 | + +延迟分位数仅统计成功 RPC;样本量较小时不能据此得出可靠的尾延迟 SLA。Nacos 可见性轮询和预热阶段不计入性能计时。 diff --git a/docs/performance/legacy/281d526_pr11.md b/docs/performance/legacy/281d526_pr11.md new file mode 100644 index 0000000..dc733f1 --- /dev/null +++ b/docs/performance/legacy/281d526_pr11.md @@ -0,0 +1,25 @@ +# RPC 历史性能报告(旧格式) + +- 提交:`281d526ebe6ccd0e970453fc9094b85bf08cfe96` +- Java:`17.0.20.1` +- JVM 可见 CPU:`4` +- 注册中心 / 协议 / 序列化器:`local / netty / kryo` +- 网络环境:`loopback` + +> 这是性能矩阵启用前保留下来的旧数据。原记录没有保存可核实的精确 CI 运行时间,因此放入 `legacy/`,不使用伪造时间补齐文件名。 + +## RPC 性能 + +| 阶段 | 请求数 | 并发度 | 吞吐 req/s | 平均 ms | P50 ms | P95 ms | P99 ms | 最大 ms | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 200 | 1 | 482.033 | 2.066 | 1.535 | 4.578 | 6.195 | 9.340 | +| 并发调用 | 1000 | 16 | 1537.520 | 10.250 | 9.376 | 17.876 | 22.806 | 27.916 | + +## 框架指标 + +| 阶段 | 侧别 | 总请求 | 成功 | 失败 | 超时 | 活跃 | 指标平均 ms | 指标最大 ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 顺序调用 | 客户端 | 200 | 200 | 0 | 0 | 0 | 1.832 | 7.988 | +| 顺序调用 | 服务端 | 200 | 200 | 0 | 0 | 0 | 0.240 | 3.970 | +| 并发调用 | 客户端 | 1000 | 1000 | 0 | 0 | 0 | 9.692 | 25.216 | +| 并发调用 | 服务端 | 1000 | 1000 | 0 | 0 | 0 | 0.661 | 12.092 |