
文章目录1. Benchmark 与 Baseline 分别是什么1.1 Benchmark基准测试1.1.1 常见的 Benchmark 工具与标准1.1.2 Benchmark 在项目生命周期中的位置1.2 Baseline基线1.3 区别1.4 关系2. 如何设计一个可信的 Benchmark2.1 先定义决策2.2 固定测试契约2.3 让负载接近真实生产2.4 执行和统计结果2.5 结果不是一个孤立排名3. 如何建立和治理 Baseline3.1 测试 Baseline 与生产 Baseline3.2 建立生产 Baseline 的步骤3.3 静态、分组与动态 Baseline3.4 Baseline 记录示例4. 应用实战场景4.1 Spark 版本升级性能回归门禁场景Benchmark 设计4.2 查询引擎选型不仅比较谁最快场景Benchmark 设计4.3 容量规划找到满足 SLA 的安全容量场景Benchmark 设计与结果4.4 生产监控从测试成绩到动态基线场景5. 常见误区5.1 把 Benchmark 等同于压测5.2 只看平均值5.3 忽略正确性和工作量5.4 在不可比的条件下比较5.5 发现回退后立即刷新 Baseline5.6 把外部成绩当成自己的生产承诺6. 一份可直接复用的检查清单7. 总结参考资料我的网站原文 https://eleanora-lyh.github.io/MyLearningNotes/csdn处的文章会尽快同步更新欢迎大家来访问1. Benchmark 与 Baseline 分别是什么在性能工程和大数据平台建设中Benchmark 与 Baseline 经常同时出现但它们并不处于同一个层次Benchmark基准测试是一把定义了使用方法的“尺子”Baseline基线是团队选定并保存下来的“参考刻度”。Benchmark主要回答在什么数据、负载、资源和执行规则下系统表现如何Baseline主要回答这次结果相对某个已知状态是改善、退化还是异常例如团队固定使用 1 TB 数据、20 条 SQL、相同计算资源和 10 个并发用户测试两个查询引擎这套测试协议和执行过程是 Benchmark。旧版本测得的P95 8.2 s被批准为后续版本的比较起点这个值才是 Baseline。实际交流中英文benchmark还可能指测试套件、一次测试结果甚至外部标杆。为了避免歧义工程文档最好明确使用下面四个词术语含义示例Benchmark specification测试协议数据、负载、环境、步骤和指标“1 TB 数据、并发 10、预热 2 次、正式运行 5 次”Benchmark run/result某次执行及其测量结果“本次 P95 查询延迟为 8.2 秒”Baseline被接受并保存的参考值或参考范围“发布版本 v3.2 的 P95 Baseline 为 8.2 秒”Target / SLO希望达到或承诺达到的目标“P95 必须小于 6 秒”Baseline 描述的是参照状态Target/SLO 描述的是期望状态。Baseline 可以低于目标也可能已经不满足目标不能把二者混为一谈。1.1 Benchmark基准测试定义一套可重复执行的测试协议或工作负载用于度量系统或组件在明确条件下的性能、容量、稳定性、正确性和成本。它包括测试方法也包括承载该方法的数据集、脚本与工具。特点测试目标、数据集、负载模型、运行环境、操作步骤和度量口径都必须明确并尽量保持一致。举例TPC-H 的 22 条 SQL 查询HiBench 中的 WordCount、K-Means 作业JMeter 压测脚本。用途场景说明技术选型选 Spark 还是 Flink选 ClickHouse 还是 Doris跑一套 Benchmark 用数据说话。版本升级验证从 Spark 2.x 升到 3.x性能是提升还是回退用 Benchmark 量化对比。容量规划数据量翻 10 倍需要加多少机器通过 Benchmark 推算线性扩展能力。参数调优验证改了 JVM 参数或并行度用 Benchmark 确认是否真的有提升。SLA 定义承诺客户 99% 查询 2 秒需要先 Benchmark 验证平台能力。硬件/云厂商评估不同机型如计算型 vs 内存型跑同样任务选性价比最高的。1.1.1 常见的 Benchmark 工具与标准工具/标准测什么TPC-H / TPC-DS决策支持/数仓查询性能SQL 复杂度高HiBenchHadoop/Spark 综合套件含 WordCount、Sort、SQL 等TPCx-HSHadoop 系统整体性能YCSBNoSQL 数据库HBase、Cassandra的读写性能TPCx-BB大数据基准测试BigBench覆盖结构化半结构化Sysbench底层系统CPU、内存、磁盘 IO性能标准套件保证了工作负载有共同语言但不等于真实生产负载。正式选型时通常需要同时运行“标准套件”和“从生产中抽取的代表性任务”。如果对外宣称官方 TPC 成绩还需要遵守对应规范的审计和披露要求内部跑了相似 SQL不应直接称为官方 TPC 成绩。1.1.2 Benchmark 在项目生命周期中的位置架构设计 → 技术选型Benchmark ① ↓ 开发完成 → 性能测试Benchmark ② ↓ 预上线 → 容量规划Benchmark ③ ↓ 生产运行 → 建立 Baseline → 日常监控告警 ↓ 版本迭代 → 回归测试Benchmark ④它是贯穿始终的活动而不是只在某个阶段做一次。1.2 Baseline基线定义一个已经确认、可用于后续比较的数值、范围或状态。它既可以来自某次受控 Benchmark也可以来自一段稳定的生产历史。特点是一个具体的数字如“单节点排序耗时 120 秒”或一组指标如“P99 延迟 50ms”。它不一定是固定值也可能是动态范围。举例优化前的“旧版本 Flink 作业吞吐量 10 万条/秒”生产环境的“正常 CPU 使用率 40%”。用途量化改进只有知道优化前是多少才能说“提升了 30%”。异常告警当线上指标偏离 Baseline 超过阈值时触发报警例如 CPU 突然飙升到 80%而 Baseline 是 40%。目标设定团队可以约定“新版本必须达到 Baseline 的 1.2 倍性能”作为交付标准。历史追溯排查问题时能回看 Baseline确认是从哪个版本开始变慢的。一个可用的 Baseline 不能只保存孤立的数字还要保存它成立的上下文Baseline 指标值/范围 工作负载与数据规模 软件版本与配置 硬件和运行环境 统计口径与样本窗口 生效时间与负责人否则“P95 延迟为 50 ms”无法说明是在单并发还是百并发、热缓存还是冷缓存、哪个版本和哪种数据规模下得到的也就无法公平比较。1.3 区别在大数据场景里Baseline基线和 Benchmark基准测试/标杆都用于比较但比较对象不同Baseline 主要回答“相对自己过去有没有异常或改善”Benchmark 主要回答“在统一条件下系统能力到底怎么样和目标或其他方案相比如何”公开资料通常也把 Baseline 定义为衡量变化的起点而 Benchmark 更多使用行业标准、竞争对象或统一测试标准作为参照。 [usertesting.com]维度BenchmarkBaseline本质测量协议、工作负载和执行过程被接受的参考值、范围或状态核心问题“在这些条件下系统能力如何”“相对参考状态发生了多大变化”主要组成数据、负载、环境、步骤、指标、报告指标值、统计口径、适用条件、生效时间典型用途技术选型、参数调优、容量测试、版本回归趋势比较、回归门禁、生产告警、异常检测变化方式测试协议应版本化条件改变时形成新版本系统稳定演进后可审批更新旧值仍需保留举例“使用固定 1 TB 数据运行 TPC-DS 类查询”“当前发布版本的 P95 是 8.2 秒”常见误区只跑一次、只看平均值或在不同环境中比较把 Baseline 当成目标、极限值或发现异常后立即覆盖1.4 关系Benchmark 结果经过正确性校验、重复性检查和团队确认后可以被选为测试 Baseline。生产系统稳定运行一段时间后也可以根据历史分位数或动态区间建立生产 Baseline不要求先跑标准 Benchmark。没有历史 Baseline 时Benchmark 仍然可以横向比较候选方案或直接与 Target/SLO 比较。有 Baseline 但不重复执行相同测量也无法判断变化。因此真正有价值的是“可重复的 Benchmark 有上下文的 Baseline”。实际工作中常说的“打 Baseline”通常是指执行一轮受控测试确认结果有效后将它登记为后续版本的比较起点。否是Benchmark 协议执行并得到结果正确且可重复修正测试或系统批准为测试 Baseline下一版本重复 Benchmark与 Baseline 和 Target 比较2. 如何设计一个可信的 BenchmarkBenchmark 的可信度不来自脚本跑得多复杂而来自三个条件可控除待比较变量外其他关键条件尽量一致。可重复其他人根据记录可以重现测试。有代表性测试负载能够覆盖真正关心的生产模式。2.1 先定义决策开始测试前先把问题写成可证伪的判断。例如决策Spark 3.5 是否可以替换 Spark 3.4 保持不变数据快照、集群资源、作业代码、配置和执行时段 唯一变量Spark 版本 正确性门槛输出行数和关键指标必须一致 性能门槛核心作业耗时回退不超过 5% 成本门槛每 TB 计算成本回退不超过 10%这比“比较两个版本谁更快”更有效因为它明确了比较对象、控制变量和通过标准。技术选型也一样不是寻找脱离场景的“最快引擎”而是判断哪个候选方案更符合当前工作负载和约束。2.2 固定测试契约一份完整的 Benchmark specification 至少要记录下面这些信息维度需要固定或记录的内容常见陷阱数据规模、快照、分布、倾斜、文件格式、压缩方式只生成均匀随机数据掩盖生产倾斜负载查询/作业集合、读写比例、并发数、到达速率只测单条最快 SQL不测混合负载环境节点数、CPU、内存、磁盘、网络、可用区两个方案实际拿到的资源不同软件引擎、JDK、依赖、配置、镜像和代码版本升级引擎时顺便修改多个参数执行冷/热缓存、预热次数、重复次数、运行顺序A 永远先跑结果受时段影响指标P50/P95/P99、吞吐量、错误率、资源和成本只看平均耗时忽略长尾与失败请求可以把这些内容版本化保存为测试清单benchmark_id:sql-engine-1tb-v1dataset:sales_snapshot_2026_08_20data_size:1TBworkload:decision_support_queries_v3concurrency:10environment:5_nodes_16c64gcache_mode:warmwarmup_runs:2measured_runs:5metrics:[p50_latency,p95_latency,throughput,error_rate,cost]只要数据、负载或环境发生了会影响可比性的变化就应该生成新的协议版本而不是悄悄覆盖旧定义。2.3 让负载接近真实生产标准套件适合建立共同语言生产样本适合回答自己的问题。两者通常需要结合用 TPC-DS、YCSB 或 HiBench 覆盖标准化能力。从生产日志中抽取高频、关键和长尾任务形成业务工作负载。保留真实的数据分布、热点 Key、小文件比例和数据倾斜。按高峰期重放并发与请求到达节奏而不是只做串行测试。同时覆盖正常路径、资源紧张和故障恢复但把不同场景分开报告。性能比较之前必须先校验正确性。一个因为少处理了数据而更快的方案不是优化。常见校验包括输出行数、关键聚合值、空值率、主键重复数以及文件或结果集校验和。2.4 执行和统计结果一次相对可靠的执行流程是清理或明确缓存状态并执行预热轮次。按预先规定的次数重复测试A/B 交替或随机运行顺序降低时段噪声。每次只改变一个待验证因素其他配置保持一致。保存每轮原始结果不只保存最终平均值。报告中位数和 P95/P99 等分位数同时报告错误率与波动范围。保存执行日志、引擎指标、资源利用率、配置快照和代码版本。不同指标的“变好方向”不同报告中应明确标注指标变好方向相对变化示例延迟、作业耗时、错误率、成本越低越好(current - baseline) / baseline大于 0 表示回退吞吐量、每秒处理行数越高越好(current - baseline) / baseline大于 0 表示提升如果 Baseline 作业耗时为 100 分钟新版本为 112 分钟则耗时回退 12%。如果吞吐量从每秒 10 万条升到 11.5 万条则吞吐量提升 15%。不要只写“快了 15%”必须同时说明指标、方向和计算口径。2.5 结果不是一个孤立排名下面是一份简化后的查询引擎评测结果方案P50 延迟P95 延迟吞吐量错误率每 1,000 次查询成本Engine A1.8 s7.6 s42 QPS0.1%18 元Engine B2.2 s5.1 s39 QPS0%14 元不能简单得出“Engine A 更快”。它的中位延迟和吞吐量更好但 Engine B 的长尾、稳定性和成本更好。最终结论应绑定决策条件例如在 P95 小于 6 秒、错误率小于 0.1% 且月度预算固定的约束下本次交互式查询场景选择 Engine B该结论只适用于sql-engine-1tb-v1定义的负载和环境。这才是一份可以被评审、复现和推翻的 Benchmark 结论。3. 如何建立和治理 BaselineBaseline 不是“第一次测出来的数字”那么简单。它必须能够代表某种稳定状态并且和当前指标处于可比条件下。3.1 测试 Baseline 与生产 Baseline大数据工程中常见的 Baseline 可以分成两类类型数据来源主要用途更新方式测试 Baseline受控 Benchmark 中已批准版本的结果升级、调优、代码变更和硬件变更的回归判断随发布版本显式更新旧版本永久留档生产 Baseline稳定生产窗口中的历史指标分布日常监控、异常检测、容量趋势和数据质量告警按日/周滚动计算但需防止异常污染二者不要混用。测试环境的 50 分钟成绩不能直接成为生产告警线因为生产还存在资源争用、数据倾斜和流量波动生产历史值也不适合直接比较两个引擎因为它无法控制其他变量。3.2 建立生产 Baseline 的步骤以每日离线 Pipeline 为例可以按下面的顺序建立生产 Baseline定义对象明确是哪个作业、数据集、租户、区域和版本。选择指标运行时间、输入行数、输入字节、数据到达时间、失败率、Shuffle 量等。划分可比组按工作日/周末、小时、数据量区间或业务季节分组。选择样本窗口例如最近 28 个正常生产日覆盖四个完整星期。选择统计量使用中位数、P95、四分位距等稳健统计量而不是只用平均值。定义告警规则Baseline 描述正常状态告警阈值还要结合容忍度和 SLO。版本化保存记录计算口径、生效时间、排除窗口和审批人。例如某文件在最近 30 个工作日的到达时间为指标BaselineP50 到达时间08:08P95 到达时间08:25业务 SLO08:35 前到达可以将08:25设为预警观察点将08:35设为违反 SLO 的严重告警点。这里的 P95 是历史 Baseline08:35 是业务目标两者含义不同。数据量也应该按可比组建立基线。假设工作日通常写入 0.9 亿至 1.1 亿行周末通常只有 0.5 亿至 0.7 亿行。如果只计算一个全月平均值周一写入 0.65 亿行可能看似正常实际上已经明显缺数。3.3 静态、分组与动态 Baseline方式适用场景优点风险静态 Baseline发布回归、固定负载测试可审计、比较稳定系统演进后可能失真分组 Baseline工作日/周末、高峰/低峰、不同数据量简单且能表达周期性分组过细会导致样本不足滚动 Baseline流量和业务持续缓慢变化能跟随趋势事故数据可能被学习成“正常”模型 Baseline多重季节性和复杂依赖关系能表达复杂模式可解释性和维护成本更高动态 Baseline 不能无条件自动更新。常见保护措施包括延迟若干天再纳入新样本给事故确认留出时间。排除已确认故障、发布窗口、回填任务和节假日活动。限制单次更新幅度突变必须人工审批。同时保留绝对 SLO避免 Baseline 随性能持续恶化而不断放宽。保存历史版本保证事后能够还原“当时为什么告警”。3.4 Baseline 记录示例一个 Baseline 注册表可以使用数据库表或配置文件实现重点是让参考值和上下文绑定baseline_id:ingestion-runtime-prod-v4object:ods_order_ingestionmetric:runtime_minutesstatistic:p95value:60segment:input_size_tb:0.8-1.2day_type:weekdaysample_window:2026-07-01/2026-07-28excluded_dates:[2026-07-09]effective_from:2026-08-01owner:data-platform当输入量变成 3 TB、作业架构重写或资源池发生变化时应建立新版本而不是拿不再可比的数据强行延长旧 Baseline。4. 应用实战场景下面的数据均为说明方法而构造重点是展示 Benchmark、Baseline 和决策如何衔接。4.1 Spark 版本升级性能回归门禁场景团队计划从 Spark 3.4 升级到 Spark 3.5希望升级后结果正确并且核心作业性能回退不超过 5%。Benchmark 设计固定一份脱敏后的生产数据快照。选择扫描、聚合、Join、窗口函数和数据倾斜等 20 个代表性作业。使用相同节点、资源队列、JDK、作业代码和 Spark 配置。每个版本先预热 2 次再交替运行 5 次。先比较行数、关键聚合值和校验和再比较耗时与资源指标。Spark 3.4 当前批准结果是测试 Baseline。部分结果如下作业3.4 Baseline 中位耗时3.5 中位耗时相对变化结论orders_etl42 分钟43 分钟2.4%通过customer_join24 分钟28 分钟16.7%阻断session_agg31 分钟29 分钟-6.5%提升customer_join的输出正确但耗时回退 16.7%同时 Shuffle Read 从 310 GB 增至 470 GB。发布门禁应阻断升级并继续检查执行计划、Join 策略、数据倾斜和 Adaptive Query Execution 配置而不是用另外两个作业的提升抵消它。回归判断的基本形式可以写成耗时回退率 (当前耗时 - Baseline 耗时) / Baseline 耗时 当正确性校验失败直接阻断 当耗时回退率 5%且差异超过历史正常波动阻断并分析升级通过并稳定发布后Spark 3.5 的批准结果可以成为下一轮变更的测试 Baseline但 Spark 3.4 的记录仍需保留。4.2 查询引擎选型不仅比较谁最快场景为 3 TB 数据上的交互式 BI 查询选择引擎。业务要求 30 并发下 P95 小于 10 秒数据新鲜度小于 15 分钟同时控制总成本。Benchmark 设计从生产查询日志中抽取 120 条查询按频率和重要性加权。使用相同数据快照、并发模型和测试时段。允许每个引擎进行合理的生产级调优但完整披露索引、物化视图和缓存策略。成本包括计算、存储、数据导入和持续运维不只比较机器单价。一组示例结果如下方案P95 延迟吞吐量成功率额外数据准备综合成本Spark SQL24.8 秒7.2 QPS100%无低Trino8.6 秒18.4 QPS99.9%无中ClickHouse2.1 秒56.0 QPS100%需要持续导入高Benchmark 不能自动替团队做决定Spark SQL 没有达到交互式查询的 P95 目标。ClickHouse 的查询性能最好但增加了数据复制、新鲜度和运维成本。Trino 达到当前 SLO且可以直接查询现有数据湖。如果当前目标是以较小架构改动满足 10 秒 SLO可以选择 Trino如果未来业务明确要求亚秒级查询再评估 ClickHouse 的额外成本。这一结论只适用于本次负载不能泛化为某个引擎“永远更快”。4.3 容量规划找到满足 SLA 的安全容量场景某 Ingestion Pipeline 当前每日处理 1 TB 数据要求在 120 分钟内完成。团队需要判断现有 10 个节点能否支撑半年后的增长。Benchmark 设计与结果保持数据分布、文件格式、节点数和作业配置不变逐级增加输入量输入量完成时间是否满足 120 分钟 SLA现象0.5 TB28 分钟是资源充足1.0 TB55 分钟是接近线性增长1.5 TB88 分钟是出现少量磁盘 Spill2.0 TB134 分钟否Shuffle Spill 和长尾 Task 明显增加测试说明性能在 1.5 TB 到 2 TB 之间出现拐点不能按 0.5 TB 的结果做线性外推。下一步应在边界附近补测 1.6、1.7、1.8 TB定位满足 SLA 的最大容量。即使最终测得 1.7 TB 可以在 120 分钟内完成也不应把 1.7 TB 当作日常规划容量。按 20% 的资源余量计算安全规划容量约为 1.36 TB用于吸收重试、资源争用和数据倾斜。若半年预测达到 1.5 TB就应提前扩容或优化分区与 Shuffle而不是等 SLA 已经失败再处理。4.4 生产监控从测试成绩到动态基线场景新 Ingestion Pipeline 上线前固定 1 TB 数据的 Benchmark 结果为旧方案90 分钟新方案55 分钟上线目标60 分钟以内55 分钟是一次Benchmark 结果。团队确认测试可重复后可以暂时把它登记为初始测试 Baseline但它还不是生产系统的正常范围。上线并稳定运行 30 天后按 0.8 至 1.2 TB 的工作日任务统计指标生产 Baseline运行时间 P5052 分钟运行时间 P9560 分钟输入量正常范围0.8 至 1.2 TB输入行数正常范围0.9 亿至 1.1 亿数据到达时间 P9508:25这组分布才是用于日常监控的生产 Baseline。之后某天输入量为 1 TB作业却运行了 85 分钟即使最终成功也应该判定为性能异常。如果作业只运行 20 分钟但输入行数只有 0.2 亿则更可能是上游缺数不能把“更快”误判为优化。这一场景中可以同时建立三类规则数据到达告警超过历史 P95 时预警超过业务 SLO 时严重告警。数据质量告警行数、空值率、重复率偏离同类日期的正常范围。性能告警在相近输入量下运行时间或单位数据成本显著偏离 Baseline。因此完整链路是上线前 Benchmark批准测试 Baseline方案上线积累稳定生产样本建立生产 Baseline监控、告警与容量趋势变更后再次 Benchmark5. 常见误区5.1 把 Benchmark 等同于压测性能测试是一个总称几种常见测试关注的问题不同测试类型主要问题Benchmark在明确、可重复的条件下系统表现如何方案之间如何比较Load Test在预期业务负载下系统是否满足要求Stress Test不断增加压力时系统在哪里失效能否优雅降级Soak Test长时间运行后是否出现泄漏、累积延迟或稳定性问题一次 Load Test 可以被设计成可重复的 Benchmark但二者并非天然等价。5.2 只看平均值平均 2 秒可能掩盖 P99 为 40 秒也可能掩盖 5% 请求直接失败。查询服务要关注延迟分位数、吞吐量和错误率批处理要关注中位耗时、长尾 Task、失败重试和资源峰值。5.3 忽略正确性和工作量少扫描分区、漏掉 Join 结果或输入数据不足都会让作业“变快”。性能指标必须和输出校验、输入量、扫描字节数一起看。5.4 在不可比的条件下比较不同数据规模、资源配置、缓存状态、并发数和测试时段得到的结果不能直接放在一起排名。如果条件无法完全一致应披露差异并说明它会怎样影响结论。5.5 发现回退后立即刷新 BaselineBaseline 的作用就是暴露变化。为了让告警消失而覆盖它会把异常重新定义为正常。只有当变化符合预期、完成验证并经过审批后才能创建新的 Baseline 版本。5.6 把外部成绩当成自己的生产承诺厂商或社区成绩可以帮助筛选候选方案但无法替代自身工作负载测试。硬件、数据分布、查询模式、调优程度和成本口径不同结论就可能完全不同。6. 一份可直接复用的检查清单执行 Benchmark 前至少回答下面的问题这次测试要支持哪个具体决策唯一计划改变的变量是什么数据和负载是否代表真实场景哪些环境、配置和版本必须固定并记录如何校验结果正确性需要测量哪些延迟、吞吐、稳定性、资源和成本指标预热、重复次数和执行顺序是什么要与哪个 Baseline、Target 或 SLO 比较建立 Baseline 时再确认下面的问题它是测试 Baseline 还是生产 Baseline指标值对应什么对象、分组、数据规模和统计口径样本窗口是否足够是否包含事故或特殊活动告警阈值与业务 SLO 是否单独定义什么情况下允许更新谁负责审批是否保留旧版本和原始测量数据7. 总结最后可以用三句话记住这两个概念Benchmark 定义怎样测固定数据、负载、环境、步骤和指标得到可重复的测量结果。Baseline 定义和谁比保存某个已知状态及其上下文用来判断改善、回退或异常。Target/SLO 定义要达到哪里它是期望或承诺不等于当前 Baseline。Benchmark 的结果可以被批准为测试 Baseline稳定生产历史也可以形成生产 Baseline。真正完整的工程闭环不是“跑一次分”而是持续执行明确决策 - 设计 Benchmark - 校验并测量 - 建立 Baseline - 监控与回归 - 审批新 Baseline - 保留历史当测试协议可复现、参考值有上下文、判断标准提前定义时Benchmark 和 Baseline 才能真正服务于技术选型、版本升级、容量规划和生产治理。参考资料Transaction Processing Performance CouncilTPC 系列 Benchmark 的规范与结果。Intel HiBench面向大数据框架的工作负载套件。Yahoo Cloud Serving Benchmark面向云数据库和 NoSQL 系统的工作负载生成与评测框架。