<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Benchmark on My Learning Notes</title><link>https://eleanora-lyh.github.io/MyLearningNotes/tags/benchmark/</link><description>Recent content in Benchmark on My Learning Notes</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 02 Sep 2026 10:27:13 +0000</lastBuildDate><atom:link href="https://eleanora-lyh.github.io/MyLearningNotes/tags/benchmark/index.xml" rel="self" type="application/rss+xml"/><item><title>【工作杂谈_20260825】数据平台与工程治理: Benchmark 与 Baseline：从基准测试到生产基线</title><link>https://eleanora-lyh.github.io/MyLearningNotes/posts/work/dataplatformengineering/20260825_%E6%95%B0%E6%8D%AE%E5%B9%B3%E5%8F%B0%E4%B8%8E%E5%B7%A5%E7%A8%8B%E6%B2%BB%E7%90%86_benchmark%E4%B8%8Ebaseline/</link><pubDate>Tue, 25 Aug 2026 19:14:25 +0800</pubDate><guid>https://eleanora-lyh.github.io/MyLearningNotes/posts/work/dataplatformengineering/20260825_%E6%95%B0%E6%8D%AE%E5%B9%B3%E5%8F%B0%E4%B8%8E%E5%B7%A5%E7%A8%8B%E6%B2%BB%E7%90%86_benchmark%E4%B8%8Ebaseline/</guid><description>&lt;h1 id="1-benchmark-与-baseline-分别是什么"&gt;1. Benchmark 与 Baseline 分别是什么
&lt;/h1&gt;&lt;p&gt;在性能工程和大数据平台建设中，Benchmark 与 Baseline 经常同时出现，但它们并不处于同一个层次：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Benchmark（基准测试）是一把定义了使用方法的“尺子”，Baseline（基线）是团队选定并保存下来的“参考刻度”。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Benchmark&lt;/strong&gt; 主要回答：在什么数据、负载、资源和执行规则下，系统表现如何？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Baseline&lt;/strong&gt; 主要回答：这次结果相对某个已知状态，是改善、退化，还是异常？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如，团队固定使用 1 TB 数据、20 条 SQL、相同计算资源和 10 个并发用户测试两个查询引擎，这套测试协议和执行过程是 Benchmark。旧版本测得的 &lt;code&gt;P95 = 8.2 s&lt;/code&gt; 被批准为后续版本的比较起点，这个值才是 Baseline。&lt;/p&gt;
&lt;p&gt;实际交流中，英文 &lt;code&gt;benchmark&lt;/code&gt; 还可能指测试套件、一次测试结果，甚至外部标杆。为了避免歧义，工程文档最好明确使用下面四个词：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;术语&lt;/th&gt;
 &lt;th&gt;含义&lt;/th&gt;
 &lt;th&gt;示例&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Benchmark specification&lt;/td&gt;
 &lt;td&gt;测试协议：数据、负载、环境、步骤和指标&lt;/td&gt;
 &lt;td&gt;“1 TB 数据、并发 10、预热 2 次、正式运行 5 次”&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Benchmark run/result&lt;/td&gt;
 &lt;td&gt;某次执行及其测量结果&lt;/td&gt;
 &lt;td&gt;“本次 P95 查询延迟为 8.2 秒”&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Baseline&lt;/td&gt;
 &lt;td&gt;被接受并保存的参考值或参考范围&lt;/td&gt;
 &lt;td&gt;“发布版本 v3.2 的 P95 Baseline 为 8.2 秒”&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Target / SLO&lt;/td&gt;
 &lt;td&gt;希望达到或承诺达到的目标&lt;/td&gt;
 &lt;td&gt;“P95 必须小于 6 秒”&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Baseline 描述的是参照状态，Target/SLO 描述的是期望状态。&lt;/strong&gt; Baseline 可以低于目标，也可能已经不满足目标，不能把二者混为一谈。&lt;/p&gt;
&lt;h2 id="11-benchmark基准测试"&gt;1.1 Benchmark（基准测试）
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：一套可重复执行的测试协议或工作负载，用于度量系统或组件在明确条件下的性能、容量、稳定性、正确性和成本。它包括测试方法，也包括承载该方法的数据集、脚本与工具。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：测试目标、数据集、负载模型、运行环境、操作步骤和度量口径都必须明确并尽量保持一致。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;举例&lt;/strong&gt;：TPC-H 的 22 条 SQL 查询；HiBench 中的 WordCount、K-Means 作业；JMeter 压测脚本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;用途&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;场景&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;技术选型&lt;/strong&gt;​&lt;/td&gt;
 &lt;td&gt;选 Spark 还是 Flink？选 ClickHouse 还是 Doris？跑一套 Benchmark 用数据说话。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;版本升级验证&lt;/strong&gt;​&lt;/td&gt;
 &lt;td&gt;从 Spark 2.x 升到 3.x，性能是提升还是回退？用 Benchmark 量化对比。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;容量规划&lt;/strong&gt;​&lt;/td&gt;
 &lt;td&gt;数据量翻 10 倍需要加多少机器？通过 Benchmark 推算线性扩展能力。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;参数调优验证&lt;/strong&gt;​&lt;/td&gt;
 &lt;td&gt;改了 JVM 参数或并行度，用 Benchmark 确认是否真的有提升。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;SLA 定义&lt;/strong&gt;​&lt;/td&gt;
 &lt;td&gt;承诺客户 99% 查询 &amp;lt; 2 秒，需要先 Benchmark 验证平台能力。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;硬件/云厂商评估&lt;/strong&gt;​&lt;/td&gt;
 &lt;td&gt;不同机型（如计算型 vs 内存型）跑同样任务，选性价比最高的。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="111-常见的-benchmark-工具与标准"&gt;1.1.1 常见的 Benchmark 工具与标准
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工具/标准&lt;/th&gt;
 &lt;th&gt;测什么&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;TPC-H / TPC-DS&lt;/strong&gt;​&lt;/td&gt;
 &lt;td&gt;决策支持/数仓查询性能（SQL 复杂度高）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;HiBench&lt;/strong&gt;​&lt;/td&gt;
 &lt;td&gt;Hadoop/Spark 综合套件（含 WordCount、Sort、SQL 等）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;TPCx-HS&lt;/strong&gt;​&lt;/td&gt;
 &lt;td&gt;Hadoop 系统整体性能&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;YCSB&lt;/strong&gt;​&lt;/td&gt;
 &lt;td&gt;NoSQL 数据库（HBase、Cassandra）的读写性能&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;TPCx-BB&lt;/strong&gt;​&lt;/td&gt;
 &lt;td&gt;大数据基准测试（BigBench，覆盖结构化+半结构化）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Sysbench&lt;/strong&gt;​&lt;/td&gt;
 &lt;td&gt;底层系统（CPU、内存、磁盘 IO）性能&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;标准套件保证了工作负载有共同语言，但不等于真实生产负载。正式选型时通常需要同时运行“标准套件”和“从生产中抽取的代表性任务”。如果对外宣称官方 TPC 成绩，还需要遵守对应规范的审计和披露要求；内部跑了相似 SQL，不应直接称为官方 TPC 成绩。&lt;/p&gt;
&lt;h3 id="112-benchmark-在项目生命周期中的位置"&gt;1.1.2 Benchmark 在项目生命周期中的位置
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;架构设计 → 技术选型（Benchmark ①）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;开发完成 → 性能测试（Benchmark ②）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;预上线 → 容量规划（Benchmark ③）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;生产运行 → 建立 Baseline → 日常监控告警
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;版本迭代 → 回归测试（Benchmark ④）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它是&lt;strong&gt;贯穿始终&lt;/strong&gt;的活动，而不是只在某个阶段做一次。&lt;/p&gt;
&lt;h2 id="12-baseline基线"&gt;1.2 Baseline（基线）
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：一个已经确认、可用于后续比较的&lt;strong&gt;数值、范围或状态&lt;/strong&gt;。它既可以来自某次受控 Benchmark，也可以来自一段稳定的生产历史。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：是一个具体的数字（如“单节点排序耗时 120 秒”）或一组指标（如“P99 延迟 50ms”）。它不一定是固定值，也可能是动态范围。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;举例&lt;/strong&gt;：优化前的“旧版本 Flink 作业吞吐量 10 万条/秒”；生产环境的“正常 CPU 使用率 40%”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;量化改进&lt;/strong&gt;：只有知道优化前是多少，才能说“提升了 30%”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异常告警&lt;/strong&gt;：当线上指标偏离 Baseline 超过阈值时触发报警（例如 CPU 突然飙升到 80%，而 Baseline 是 40%）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标设定&lt;/strong&gt;：团队可以约定“新版本必须达到 Baseline 的 1.2 倍性能”作为交付标准。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;历史追溯&lt;/strong&gt;：排查问题时能回看 Baseline，确认是从哪个版本开始变慢的。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个可用的 Baseline 不能只保存孤立的数字，还要保存它成立的上下文：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Baseline = 指标值/范围
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; + 工作负载与数据规模
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; + 软件版本与配置
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; + 硬件和运行环境
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; + 统计口径与样本窗口
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; + 生效时间与负责人
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;否则，“P95 延迟为 50 ms”无法说明是在单并发还是百并发、热缓存还是冷缓存、哪个版本和哪种数据规模下得到的，也就无法公平比较。&lt;/p&gt;
&lt;h2 id="13-区别"&gt;1.3 区别
&lt;/h2&gt;&lt;p&gt;在大数据场景里，&lt;strong&gt;Baseline（基线）和 Benchmark（基准测试/标杆）&lt;/strong&gt; 都用于比较，但比较对象不同：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Baseline 主要回答“相对自己过去有没有异常或改善？”&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Benchmark 主要回答“在统一条件下，系统能力到底怎么样，和目标或其他方案相比如何？”&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;公开资料通常也把 Baseline 定义为衡量变化的起点，而 Benchmark 更多使用行业标准、竞争对象或统一测试标准作为参照。 &lt;a class="link" href="https://www.usertesting.com/blog/research-benchmarking-vs-baselines" target="_blank" rel="noopener"
 &gt;[usertesting.com]&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th&gt;Benchmark&lt;/th&gt;
 &lt;th&gt;Baseline&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;本质&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;测量协议、工作负载和执行过程&lt;/td&gt;
 &lt;td&gt;被接受的参考值、范围或状态&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;核心问题&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;“在这些条件下，系统能力如何？”&lt;/td&gt;
 &lt;td&gt;“相对参考状态，发生了多大变化？”&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;主要组成&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;数据、负载、环境、步骤、指标、报告&lt;/td&gt;
 &lt;td&gt;指标值、统计口径、适用条件、生效时间&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;典型用途&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;技术选型、参数调优、容量测试、版本回归&lt;/td&gt;
 &lt;td&gt;趋势比较、回归门禁、生产告警、异常检测&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;变化方式&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;测试协议应版本化；条件改变时形成新版本&lt;/td&gt;
 &lt;td&gt;系统稳定演进后可审批更新，旧值仍需保留&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;举例&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;“使用固定 1 TB 数据运行 TPC-DS 类查询”&lt;/td&gt;
 &lt;td&gt;“当前发布版本的 P95 是 8.2 秒”&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;常见误区&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;只跑一次、只看平均值，或在不同环境中比较&lt;/td&gt;
 &lt;td&gt;把 Baseline 当成目标、极限值，或发现异常后立即覆盖&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="14-关系"&gt;1.4 关系
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Benchmark 结果经过正确性校验、重复性检查和团队确认后，&lt;strong&gt;可以被选为测试 Baseline&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;生产系统稳定运行一段时间后，也可以根据历史分位数或动态区间建立&lt;strong&gt;生产 Baseline&lt;/strong&gt;，不要求先跑标准 Benchmark。&lt;/li&gt;
&lt;li&gt;没有历史 Baseline 时，Benchmark 仍然可以横向比较候选方案，或直接与 Target/SLO 比较。&lt;/li&gt;
&lt;li&gt;有 Baseline 但不重复执行相同测量，也无法判断变化。因此，真正有价值的是“可重复的 Benchmark + 有上下文的 Baseline”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际工作中常说的“打 Baseline”，通常是指执行一轮受控测试，确认结果有效后，将它登记为后续版本的比较起点。&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR
 S["Benchmark 协议"] --&gt; R["执行并得到结果"]
 R --&gt; V{"正确且可重复？"}
 V --&gt;|否| F["修正测试或系统"]
 V --&gt;|是| B["批准为测试 Baseline"]
 B --&gt; N["下一版本重复 Benchmark"]
 N --&gt; C["与 Baseline 和 Target 比较"]&lt;/pre&gt;&lt;h1 id="2-如何设计一个可信的-benchmark"&gt;2. 如何设计一个可信的 Benchmark
&lt;/h1&gt;&lt;p&gt;Benchmark 的可信度不来自脚本跑得多复杂，而来自三个条件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;可控&lt;/strong&gt;：除待比较变量外，其他关键条件尽量一致。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可重复&lt;/strong&gt;：其他人根据记录可以重现测试。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有代表性&lt;/strong&gt;：测试负载能够覆盖真正关心的生产模式。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="21-先定义决策"&gt;2.1 先定义决策
&lt;/h2&gt;&lt;p&gt;开始测试前，先把问题写成可证伪的判断。例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;决策：Spark 3.5 是否可以替换 Spark 3.4？
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;保持不变：数据快照、集群资源、作业代码、配置和执行时段
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;唯一变量：Spark 版本
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;正确性门槛：输出行数和关键指标必须一致
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;性能门槛：核心作业耗时回退不超过 5%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;成本门槛：每 TB 计算成本回退不超过 10%
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这比“比较两个版本谁更快”更有效，因为它明确了比较对象、控制变量和通过标准。技术选型也一样：不是寻找脱离场景的“最快引擎”，而是判断哪个候选方案更符合当前工作负载和约束。&lt;/p&gt;
&lt;h2 id="22-固定测试契约"&gt;2.2 固定测试契约
&lt;/h2&gt;&lt;p&gt;一份完整的 Benchmark specification 至少要记录下面这些信息：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th&gt;需要固定或记录的内容&lt;/th&gt;
 &lt;th&gt;常见陷阱&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;数据&lt;/td&gt;
 &lt;td&gt;规模、快照、分布、倾斜、文件格式、压缩方式&lt;/td&gt;
 &lt;td&gt;只生成均匀随机数据，掩盖生产倾斜&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;负载&lt;/td&gt;
 &lt;td&gt;查询/作业集合、读写比例、并发数、到达速率&lt;/td&gt;
 &lt;td&gt;只测单条最快 SQL，不测混合负载&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;环境&lt;/td&gt;
 &lt;td&gt;节点数、CPU、内存、磁盘、网络、可用区&lt;/td&gt;
 &lt;td&gt;两个方案实际拿到的资源不同&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;软件&lt;/td&gt;
 &lt;td&gt;引擎、JDK、依赖、配置、镜像和代码版本&lt;/td&gt;
 &lt;td&gt;升级引擎时顺便修改多个参数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;执行&lt;/td&gt;
 &lt;td&gt;冷/热缓存、预热次数、重复次数、运行顺序&lt;/td&gt;
 &lt;td&gt;A 永远先跑，结果受时段影响&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;指标&lt;/td&gt;
 &lt;td&gt;P50/P95/P99、吞吐量、错误率、资源和成本&lt;/td&gt;
 &lt;td&gt;只看平均耗时，忽略长尾与失败请求&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;可以把这些内容版本化保存为测试清单：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;benchmark_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;sql-engine-1tb-v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;dataset&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;sales_snapshot_2026_08_20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;data_size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1TB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;workload&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;decision_support_queries_v3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;concurrency&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;environment&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5_nodes_16c64g&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;cache_mode&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;warm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;warmup_runs&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;measured_runs&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metrics&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;p50_latency, p95_latency, throughput, error_rate, cost]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;只要数据、负载或环境发生了会影响可比性的变化，就应该生成新的协议版本，而不是悄悄覆盖旧定义。&lt;/p&gt;
&lt;h2 id="23-让负载接近真实生产"&gt;2.3 让负载接近真实生产
&lt;/h2&gt;&lt;p&gt;标准套件适合建立共同语言，生产样本适合回答自己的问题。两者通常需要结合：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用 TPC-DS、YCSB 或 HiBench 覆盖标准化能力。&lt;/li&gt;
&lt;li&gt;从生产日志中抽取高频、关键和长尾任务，形成业务工作负载。&lt;/li&gt;
&lt;li&gt;保留真实的数据分布、热点 Key、小文件比例和数据倾斜。&lt;/li&gt;
&lt;li&gt;按高峰期重放并发与请求到达节奏，而不是只做串行测试。&lt;/li&gt;
&lt;li&gt;同时覆盖正常路径、资源紧张和故障恢复，但把不同场景分开报告。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;性能比较之前必须先校验正确性。一个因为少处理了数据而更快的方案不是优化。常见校验包括输出行数、关键聚合值、空值率、主键重复数，以及文件或结果集校验和。&lt;/p&gt;
&lt;h2 id="24-执行和统计结果"&gt;2.4 执行和统计结果
&lt;/h2&gt;&lt;p&gt;一次相对可靠的执行流程是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;清理或明确缓存状态，并执行预热轮次。&lt;/li&gt;
&lt;li&gt;按预先规定的次数重复测试；A/B 交替或随机运行顺序，降低时段噪声。&lt;/li&gt;
&lt;li&gt;每次只改变一个待验证因素，其他配置保持一致。&lt;/li&gt;
&lt;li&gt;保存每轮原始结果，不只保存最终平均值。&lt;/li&gt;
&lt;li&gt;报告中位数和 P95/P99 等分位数，同时报告错误率与波动范围。&lt;/li&gt;
&lt;li&gt;保存执行日志、引擎指标、资源利用率、配置快照和代码版本。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;不同指标的“变好方向”不同，报告中应明确标注：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指标&lt;/th&gt;
 &lt;th&gt;变好方向&lt;/th&gt;
 &lt;th&gt;相对变化示例&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;延迟、作业耗时、错误率、成本&lt;/td&gt;
 &lt;td&gt;越低越好&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;(current - baseline) / baseline&lt;/code&gt; 大于 0 表示回退&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;吞吐量、每秒处理行数&lt;/td&gt;
 &lt;td&gt;越高越好&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;(current - baseline) / baseline&lt;/code&gt; 大于 0 表示提升&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果 Baseline 作业耗时为 100 分钟，新版本为 112 分钟，则耗时回退 12%。如果吞吐量从每秒 10 万条升到 11.5 万条，则吞吐量提升 15%。不要只写“快了 15%”，必须同时说明指标、方向和计算口径。&lt;/p&gt;
&lt;h2 id="25-结果不是一个孤立排名"&gt;2.5 结果不是一个孤立排名
&lt;/h2&gt;&lt;p&gt;下面是一份简化后的查询引擎评测结果：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;方案&lt;/th&gt;
 &lt;th style="text-align: right"&gt;P50 延迟&lt;/th&gt;
 &lt;th style="text-align: right"&gt;P95 延迟&lt;/th&gt;
 &lt;th style="text-align: right"&gt;吞吐量&lt;/th&gt;
 &lt;th style="text-align: right"&gt;错误率&lt;/th&gt;
 &lt;th style="text-align: right"&gt;每 1,000 次查询成本&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Engine A&lt;/td&gt;
 &lt;td style="text-align: right"&gt;1.8 s&lt;/td&gt;
 &lt;td style="text-align: right"&gt;7.6 s&lt;/td&gt;
 &lt;td style="text-align: right"&gt;42 QPS&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0.1%&lt;/td&gt;
 &lt;td style="text-align: right"&gt;18 元&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Engine B&lt;/td&gt;
 &lt;td style="text-align: right"&gt;2.2 s&lt;/td&gt;
 &lt;td style="text-align: right"&gt;5.1 s&lt;/td&gt;
 &lt;td style="text-align: right"&gt;39 QPS&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0%&lt;/td&gt;
 &lt;td style="text-align: right"&gt;14 元&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;不能简单得出“Engine A 更快”。它的中位延迟和吞吐量更好，但 Engine B 的长尾、稳定性和成本更好。最终结论应绑定决策条件，例如：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;在 P95 小于 6 秒、错误率小于 0.1% 且月度预算固定的约束下，本次交互式查询场景选择 Engine B；该结论只适用于 &lt;code&gt;sql-engine-1tb-v1&lt;/code&gt; 定义的负载和环境。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这才是一份可以被评审、复现和推翻的 Benchmark 结论。&lt;/p&gt;
&lt;h1 id="3-如何建立和治理-baseline"&gt;3. 如何建立和治理 Baseline
&lt;/h1&gt;&lt;p&gt;Baseline 不是“第一次测出来的数字”那么简单。它必须能够代表某种稳定状态，并且和当前指标处于可比条件下。&lt;/p&gt;
&lt;h2 id="31-测试-baseline-与生产-baseline"&gt;3.1 测试 Baseline 与生产 Baseline
&lt;/h2&gt;&lt;p&gt;大数据工程中常见的 Baseline 可以分成两类：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;类型&lt;/th&gt;
 &lt;th&gt;数据来源&lt;/th&gt;
 &lt;th&gt;主要用途&lt;/th&gt;
 &lt;th&gt;更新方式&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;测试 Baseline&lt;/td&gt;
 &lt;td&gt;受控 Benchmark 中已批准版本的结果&lt;/td&gt;
 &lt;td&gt;升级、调优、代码变更和硬件变更的回归判断&lt;/td&gt;
 &lt;td&gt;随发布版本显式更新，旧版本永久留档&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;生产 Baseline&lt;/td&gt;
 &lt;td&gt;稳定生产窗口中的历史指标分布&lt;/td&gt;
 &lt;td&gt;日常监控、异常检测、容量趋势和数据质量告警&lt;/td&gt;
 &lt;td&gt;按日/周滚动计算，但需防止异常污染&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;二者不要混用。测试环境的 50 分钟成绩不能直接成为生产告警线，因为生产还存在资源争用、数据倾斜和流量波动；生产历史值也不适合直接比较两个引擎，因为它无法控制其他变量。&lt;/p&gt;
&lt;h2 id="32-建立生产-baseline-的步骤"&gt;3.2 建立生产 Baseline 的步骤
&lt;/h2&gt;&lt;p&gt;以每日离线 Pipeline 为例，可以按下面的顺序建立生产 Baseline：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定义对象&lt;/strong&gt;：明确是哪个作业、数据集、租户、区域和版本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选择指标&lt;/strong&gt;：运行时间、输入行数、输入字节、数据到达时间、失败率、Shuffle 量等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;划分可比组&lt;/strong&gt;：按工作日/周末、小时、数据量区间或业务季节分组。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选择样本窗口&lt;/strong&gt;：例如最近 28 个正常生产日，覆盖四个完整星期。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选择统计量&lt;/strong&gt;：使用中位数、P95、四分位距等稳健统计量，而不是只用平均值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定义告警规则&lt;/strong&gt;：Baseline 描述正常状态，告警阈值还要结合容忍度和 SLO。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;版本化保存&lt;/strong&gt;：记录计算口径、生效时间、排除窗口和审批人。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如某文件在最近 30 个工作日的到达时间为：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指标&lt;/th&gt;
 &lt;th&gt;Baseline&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;P50 到达时间&lt;/td&gt;
 &lt;td&gt;08:08&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;P95 到达时间&lt;/td&gt;
 &lt;td&gt;08:25&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;业务 SLO&lt;/td&gt;
 &lt;td&gt;08:35 前到达&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;可以将 &lt;code&gt;08:25&lt;/code&gt; 设为预警观察点，将 &lt;code&gt;08:35&lt;/code&gt; 设为违反 SLO 的严重告警点。这里的 P95 是历史 Baseline，08:35 是业务目标，两者含义不同。&lt;/p&gt;
&lt;p&gt;数据量也应该按可比组建立基线。假设工作日通常写入 0.9 亿至 1.1 亿行，周末通常只有 0.5 亿至 0.7 亿行。如果只计算一个全月平均值，周一写入 0.65 亿行可能看似正常，实际上已经明显缺数。&lt;/p&gt;
&lt;h2 id="33-静态分组与动态-baseline"&gt;3.3 静态、分组与动态 Baseline
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;方式&lt;/th&gt;
 &lt;th&gt;适用场景&lt;/th&gt;
 &lt;th&gt;优点&lt;/th&gt;
 &lt;th&gt;风险&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;静态 Baseline&lt;/td&gt;
 &lt;td&gt;发布回归、固定负载测试&lt;/td&gt;
 &lt;td&gt;可审计、比较稳定&lt;/td&gt;
 &lt;td&gt;系统演进后可能失真&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;分组 Baseline&lt;/td&gt;
 &lt;td&gt;工作日/周末、高峰/低峰、不同数据量&lt;/td&gt;
 &lt;td&gt;简单且能表达周期性&lt;/td&gt;
 &lt;td&gt;分组过细会导致样本不足&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;滚动 Baseline&lt;/td&gt;
 &lt;td&gt;流量和业务持续缓慢变化&lt;/td&gt;
 &lt;td&gt;能跟随趋势&lt;/td&gt;
 &lt;td&gt;事故数据可能被学习成“正常”&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;模型 Baseline&lt;/td&gt;
 &lt;td&gt;多重季节性和复杂依赖关系&lt;/td&gt;
 &lt;td&gt;能表达复杂模式&lt;/td&gt;
 &lt;td&gt;可解释性和维护成本更高&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;动态 Baseline 不能无条件自动更新。常见保护措施包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;延迟若干天再纳入新样本，给事故确认留出时间。&lt;/li&gt;
&lt;li&gt;排除已确认故障、发布窗口、回填任务和节假日活动。&lt;/li&gt;
&lt;li&gt;限制单次更新幅度，突变必须人工审批。&lt;/li&gt;
&lt;li&gt;同时保留绝对 SLO，避免 Baseline 随性能持续恶化而不断放宽。&lt;/li&gt;
&lt;li&gt;保存历史版本，保证事后能够还原“当时为什么告警”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="34-baseline-记录示例"&gt;3.4 Baseline 记录示例
&lt;/h2&gt;&lt;p&gt;一个 Baseline 注册表可以使用数据库表或配置文件实现，重点是让参考值和上下文绑定：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;baseline_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ingestion-runtime-prod-v4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;object&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ods_order_ingestion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metric&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;runtime_minutes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;statistic&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;p95&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;value&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;segment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;input_size_tb&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;0.8-1.2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;day_type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;weekday&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;sample_window&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2026-07-01/2026-07-28&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;excluded_dates&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;2026-07-09&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;effective_from&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2026-08-01&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;owner&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;data-platform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;当输入量变成 3 TB、作业架构重写或资源池发生变化时，应建立新版本，而不是拿不再可比的数据强行延长旧 Baseline。&lt;/p&gt;
&lt;h1 id="4-应用实战场景"&gt;4. 应用实战场景
&lt;/h1&gt;&lt;p&gt;下面的数据均为说明方法而构造，重点是展示 Benchmark、Baseline 和决策如何衔接。&lt;/p&gt;
&lt;h2 id="41-spark-版本升级性能回归门禁"&gt;4.1 Spark 版本升级：性能回归门禁
&lt;/h2&gt;&lt;h3 id="场景"&gt;场景
&lt;/h3&gt;&lt;p&gt;团队计划从 Spark 3.4 升级到 Spark 3.5，希望升级后结果正确，并且核心作业性能回退不超过 5%。&lt;/p&gt;
&lt;h3 id="benchmark-设计"&gt;Benchmark 设计
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;固定一份脱敏后的生产数据快照。&lt;/li&gt;
&lt;li&gt;选择扫描、聚合、Join、窗口函数和数据倾斜等 20 个代表性作业。&lt;/li&gt;
&lt;li&gt;使用相同节点、资源队列、JDK、作业代码和 Spark 配置。&lt;/li&gt;
&lt;li&gt;每个版本先预热 2 次，再交替运行 5 次。&lt;/li&gt;
&lt;li&gt;先比较行数、关键聚合值和校验和，再比较耗时与资源指标。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Spark 3.4 当前批准结果是&lt;strong&gt;测试 Baseline&lt;/strong&gt;。部分结果如下：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;作业&lt;/th&gt;
 &lt;th style="text-align: right"&gt;3.4 Baseline 中位耗时&lt;/th&gt;
 &lt;th style="text-align: right"&gt;3.5 中位耗时&lt;/th&gt;
 &lt;th style="text-align: right"&gt;相对变化&lt;/th&gt;
 &lt;th&gt;结论&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;orders_etl&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;42 分钟&lt;/td&gt;
 &lt;td style="text-align: right"&gt;43 分钟&lt;/td&gt;
 &lt;td style="text-align: right"&gt;+2.4%&lt;/td&gt;
 &lt;td&gt;通过&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;customer_join&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;24 分钟&lt;/td&gt;
 &lt;td style="text-align: right"&gt;28 分钟&lt;/td&gt;
 &lt;td style="text-align: right"&gt;+16.7%&lt;/td&gt;
 &lt;td&gt;阻断&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;session_agg&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;31 分钟&lt;/td&gt;
 &lt;td style="text-align: right"&gt;29 分钟&lt;/td&gt;
 &lt;td style="text-align: right"&gt;-6.5%&lt;/td&gt;
 &lt;td&gt;提升&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;customer_join&lt;/code&gt; 的输出正确，但耗时回退 16.7%，同时 Shuffle Read 从 310 GB 增至 470 GB。发布门禁应阻断升级，并继续检查执行计划、Join 策略、数据倾斜和 Adaptive Query Execution 配置，而不是用另外两个作业的提升抵消它。&lt;/p&gt;
&lt;p&gt;回归判断的基本形式可以写成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;耗时回退率 = (当前耗时 - Baseline 耗时) / Baseline 耗时
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;当正确性校验失败：直接阻断
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;当耗时回退率 &amp;gt; 5%，且差异超过历史正常波动：阻断并分析
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;升级通过并稳定发布后，Spark 3.5 的批准结果可以成为下一轮变更的测试 Baseline，但 Spark 3.4 的记录仍需保留。&lt;/p&gt;
&lt;h2 id="42-查询引擎选型不仅比较谁最快"&gt;4.2 查询引擎选型：不仅比较谁最快
&lt;/h2&gt;&lt;h3 id="场景-1"&gt;场景
&lt;/h3&gt;&lt;p&gt;为 3 TB 数据上的交互式 BI 查询选择引擎。业务要求 30 并发下 P95 小于 10 秒，数据新鲜度小于 15 分钟，同时控制总成本。&lt;/p&gt;
&lt;h3 id="benchmark-设计-1"&gt;Benchmark 设计
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;从生产查询日志中抽取 120 条查询，按频率和重要性加权。&lt;/li&gt;
&lt;li&gt;使用相同数据快照、并发模型和测试时段。&lt;/li&gt;
&lt;li&gt;允许每个引擎进行合理的生产级调优，但完整披露索引、物化视图和缓存策略。&lt;/li&gt;
&lt;li&gt;成本包括计算、存储、数据导入和持续运维，不只比较机器单价。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一组示例结果如下：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;方案&lt;/th&gt;
 &lt;th style="text-align: right"&gt;P95 延迟&lt;/th&gt;
 &lt;th style="text-align: right"&gt;吞吐量&lt;/th&gt;
 &lt;th style="text-align: right"&gt;成功率&lt;/th&gt;
 &lt;th&gt;额外数据准备&lt;/th&gt;
 &lt;th&gt;综合成本&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Spark SQL&lt;/td&gt;
 &lt;td style="text-align: right"&gt;24.8 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;7.2 QPS&lt;/td&gt;
 &lt;td style="text-align: right"&gt;100%&lt;/td&gt;
 &lt;td&gt;无&lt;/td&gt;
 &lt;td&gt;低&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Trino&lt;/td&gt;
 &lt;td style="text-align: right"&gt;8.6 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;18.4 QPS&lt;/td&gt;
 &lt;td style="text-align: right"&gt;99.9%&lt;/td&gt;
 &lt;td&gt;无&lt;/td&gt;
 &lt;td&gt;中&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ClickHouse&lt;/td&gt;
 &lt;td style="text-align: right"&gt;2.1 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;56.0 QPS&lt;/td&gt;
 &lt;td style="text-align: right"&gt;100%&lt;/td&gt;
 &lt;td&gt;需要持续导入&lt;/td&gt;
 &lt;td&gt;高&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Benchmark 不能自动替团队做决定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spark SQL 没有达到交互式查询的 P95 目标。&lt;/li&gt;
&lt;li&gt;ClickHouse 的查询性能最好，但增加了数据复制、新鲜度和运维成本。&lt;/li&gt;
&lt;li&gt;Trino 达到当前 SLO，且可以直接查询现有数据湖。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果当前目标是以较小架构改动满足 10 秒 SLO，可以选择 Trino；如果未来业务明确要求亚秒级查询，再评估 ClickHouse 的额外成本。这一结论只适用于本次负载，不能泛化为某个引擎“永远更快”。&lt;/p&gt;
&lt;h2 id="43-容量规划找到满足-sla-的安全容量"&gt;4.3 容量规划：找到满足 SLA 的安全容量
&lt;/h2&gt;&lt;h3 id="场景-2"&gt;场景
&lt;/h3&gt;&lt;p&gt;某 Ingestion Pipeline 当前每日处理 1 TB 数据，要求在 120 分钟内完成。团队需要判断现有 10 个节点能否支撑半年后的增长。&lt;/p&gt;
&lt;h3 id="benchmark-设计与结果"&gt;Benchmark 设计与结果
&lt;/h3&gt;&lt;p&gt;保持数据分布、文件格式、节点数和作业配置不变，逐级增加输入量：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: right"&gt;输入量&lt;/th&gt;
 &lt;th style="text-align: right"&gt;完成时间&lt;/th&gt;
 &lt;th&gt;是否满足 120 分钟 SLA&lt;/th&gt;
 &lt;th&gt;现象&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;0.5 TB&lt;/td&gt;
 &lt;td style="text-align: right"&gt;28 分钟&lt;/td&gt;
 &lt;td&gt;是&lt;/td&gt;
 &lt;td&gt;资源充足&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;1.0 TB&lt;/td&gt;
 &lt;td style="text-align: right"&gt;55 分钟&lt;/td&gt;
 &lt;td&gt;是&lt;/td&gt;
 &lt;td&gt;接近线性增长&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;1.5 TB&lt;/td&gt;
 &lt;td style="text-align: right"&gt;88 分钟&lt;/td&gt;
 &lt;td&gt;是&lt;/td&gt;
 &lt;td&gt;出现少量磁盘 Spill&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;2.0 TB&lt;/td&gt;
 &lt;td style="text-align: right"&gt;134 分钟&lt;/td&gt;
 &lt;td&gt;否&lt;/td&gt;
 &lt;td&gt;Shuffle Spill 和长尾 Task 明显增加&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;测试说明性能在 1.5 TB 到 2 TB 之间出现拐点，不能按 0.5 TB 的结果做线性外推。下一步应在边界附近补测 1.6、1.7、1.8 TB，定位满足 SLA 的最大容量。&lt;/p&gt;
&lt;p&gt;即使最终测得 1.7 TB 可以在 120 分钟内完成，也不应把 1.7 TB 当作日常规划容量。按 20% 的资源余量计算，安全规划容量约为 1.36 TB，用于吸收重试、资源争用和数据倾斜。若半年预测达到 1.5 TB，就应提前扩容或优化分区与 Shuffle，而不是等 SLA 已经失败再处理。&lt;/p&gt;
&lt;h2 id="44-生产监控从测试成绩到动态基线"&gt;4.4 生产监控：从测试成绩到动态基线
&lt;/h2&gt;&lt;h3 id="场景-3"&gt;场景
&lt;/h3&gt;&lt;p&gt;新 Ingestion Pipeline 上线前，固定 1 TB 数据的 Benchmark 结果为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;旧方案：90 分钟&lt;/li&gt;
&lt;li&gt;新方案：55 分钟&lt;/li&gt;
&lt;li&gt;上线目标：60 分钟以内&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;55 分钟&lt;/code&gt; 是一次 &lt;strong&gt;Benchmark 结果&lt;/strong&gt;。团队确认测试可重复后，可以暂时把它登记为&lt;strong&gt;初始测试 Baseline&lt;/strong&gt;，但它还不是生产系统的正常范围。&lt;/p&gt;
&lt;p&gt;上线并稳定运行 30 天后，按 0.8 至 1.2 TB 的工作日任务统计：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指标&lt;/th&gt;
 &lt;th&gt;生产 Baseline&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;运行时间 P50&lt;/td&gt;
 &lt;td&gt;52 分钟&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;运行时间 P95&lt;/td&gt;
 &lt;td&gt;60 分钟&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;输入量正常范围&lt;/td&gt;
 &lt;td&gt;0.8 至 1.2 TB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;输入行数正常范围&lt;/td&gt;
 &lt;td&gt;0.9 亿至 1.1 亿&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;数据到达时间 P95&lt;/td&gt;
 &lt;td&gt;08:25&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这组分布才是用于日常监控的&lt;strong&gt;生产 Baseline&lt;/strong&gt;。之后某天输入量为 1 TB，作业却运行了 85 分钟，即使最终成功，也应该判定为性能异常。如果作业只运行 20 分钟，但输入行数只有 0.2 亿，则更可能是上游缺数，不能把“更快”误判为优化。&lt;/p&gt;
&lt;p&gt;这一场景中可以同时建立三类规则：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据到达告警&lt;/strong&gt;：超过历史 P95 时预警，超过业务 SLO 时严重告警。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据质量告警&lt;/strong&gt;：行数、空值率、重复率偏离同类日期的正常范围。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能告警&lt;/strong&gt;：在相近输入量下，运行时间或单位数据成本显著偏离 Baseline。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因此，完整链路是：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR
 A["上线前 Benchmark"] --&gt; B["批准测试 Baseline"]
 B --&gt; C["方案上线"]
 C --&gt; D["积累稳定生产样本"]
 D --&gt; E["建立生产 Baseline"]
 E --&gt; F["监控、告警与容量趋势"]
 F --&gt; G["变更后再次 Benchmark"]&lt;/pre&gt;&lt;h1 id="5-常见误区"&gt;5. 常见误区
&lt;/h1&gt;&lt;h2 id="51-把-benchmark-等同于压测"&gt;5.1 把 Benchmark 等同于压测
&lt;/h2&gt;&lt;p&gt;性能测试是一个总称，几种常见测试关注的问题不同：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;测试类型&lt;/th&gt;
 &lt;th&gt;主要问题&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Benchmark&lt;/td&gt;
 &lt;td&gt;在明确、可重复的条件下，系统表现如何，方案之间如何比较？&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Load Test&lt;/td&gt;
 &lt;td&gt;在预期业务负载下，系统是否满足要求？&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Stress Test&lt;/td&gt;
 &lt;td&gt;不断增加压力时，系统在哪里失效，能否优雅降级？&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Soak Test&lt;/td&gt;
 &lt;td&gt;长时间运行后，是否出现泄漏、累积延迟或稳定性问题？&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一次 Load Test 可以被设计成可重复的 Benchmark，但二者并非天然等价。&lt;/p&gt;
&lt;h2 id="52-只看平均值"&gt;5.2 只看平均值
&lt;/h2&gt;&lt;p&gt;平均 2 秒可能掩盖 P99 为 40 秒，也可能掩盖 5% 请求直接失败。查询服务要关注延迟分位数、吞吐量和错误率；批处理要关注中位耗时、长尾 Task、失败重试和资源峰值。&lt;/p&gt;
&lt;h2 id="53-忽略正确性和工作量"&gt;5.3 忽略正确性和工作量
&lt;/h2&gt;&lt;p&gt;少扫描分区、漏掉 Join 结果或输入数据不足都会让作业“变快”。性能指标必须和输出校验、输入量、扫描字节数一起看。&lt;/p&gt;
&lt;h2 id="54-在不可比的条件下比较"&gt;5.4 在不可比的条件下比较
&lt;/h2&gt;&lt;p&gt;不同数据规模、资源配置、缓存状态、并发数和测试时段得到的结果不能直接放在一起排名。如果条件无法完全一致，应披露差异并说明它会怎样影响结论。&lt;/p&gt;
&lt;h2 id="55-发现回退后立即刷新-baseline"&gt;5.5 发现回退后立即刷新 Baseline
&lt;/h2&gt;&lt;p&gt;Baseline 的作用就是暴露变化。为了让告警消失而覆盖它，会把异常重新定义为正常。只有当变化符合预期、完成验证并经过审批后，才能创建新的 Baseline 版本。&lt;/p&gt;
&lt;h2 id="56-把外部成绩当成自己的生产承诺"&gt;5.6 把外部成绩当成自己的生产承诺
&lt;/h2&gt;&lt;p&gt;厂商或社区成绩可以帮助筛选候选方案，但无法替代自身工作负载测试。硬件、数据分布、查询模式、调优程度和成本口径不同，结论就可能完全不同。&lt;/p&gt;
&lt;h1 id="6-一份可直接复用的检查清单"&gt;6. 一份可直接复用的检查清单
&lt;/h1&gt;&lt;p&gt;执行 Benchmark 前，至少回答下面的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这次测试要支持哪个具体决策？&lt;/li&gt;
&lt;li&gt;唯一计划改变的变量是什么？&lt;/li&gt;
&lt;li&gt;数据和负载是否代表真实场景？&lt;/li&gt;
&lt;li&gt;哪些环境、配置和版本必须固定并记录？&lt;/li&gt;
&lt;li&gt;如何校验结果正确性？&lt;/li&gt;
&lt;li&gt;需要测量哪些延迟、吞吐、稳定性、资源和成本指标？&lt;/li&gt;
&lt;li&gt;预热、重复次数和执行顺序是什么？&lt;/li&gt;
&lt;li&gt;要与哪个 Baseline、Target 或 SLO 比较？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;建立 Baseline 时，再确认下面的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它是测试 Baseline 还是生产 Baseline？&lt;/li&gt;
&lt;li&gt;指标值对应什么对象、分组、数据规模和统计口径？&lt;/li&gt;
&lt;li&gt;样本窗口是否足够，是否包含事故或特殊活动？&lt;/li&gt;
&lt;li&gt;告警阈值与业务 SLO 是否单独定义？&lt;/li&gt;
&lt;li&gt;什么情况下允许更新，谁负责审批？&lt;/li&gt;
&lt;li&gt;是否保留旧版本和原始测量数据？&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="7-总结"&gt;7. 总结
&lt;/h1&gt;&lt;p&gt;最后可以用三句话记住这两个概念：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Benchmark 定义怎样测&lt;/strong&gt;：固定数据、负载、环境、步骤和指标，得到可重复的测量结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Baseline 定义和谁比&lt;/strong&gt;：保存某个已知状态及其上下文，用来判断改善、回退或异常。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target/SLO 定义要达到哪里&lt;/strong&gt;：它是期望或承诺，不等于当前 Baseline。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Benchmark 的结果可以被批准为测试 Baseline，稳定生产历史也可以形成生产 Baseline。真正完整的工程闭环不是“跑一次分”，而是持续执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;明确决策 -&amp;gt; 设计 Benchmark -&amp;gt; 校验并测量 -&amp;gt; 建立 Baseline
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -&amp;gt; 监控与回归 -&amp;gt; 审批新 Baseline -&amp;gt; 保留历史
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;当测试协议可复现、参考值有上下文、判断标准提前定义时，Benchmark 和 Baseline 才能真正服务于技术选型、版本升级、容量规划和生产治理。&lt;/p&gt;
&lt;h1 id="参考资料"&gt;参考资料
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.tpc.org/" target="_blank" rel="noopener"
 &gt;Transaction Processing Performance Council&lt;/a&gt;：TPC 系列 Benchmark 的规范与结果。&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Intel-bigdata/HiBench" target="_blank" rel="noopener"
 &gt;Intel HiBench&lt;/a&gt;：面向大数据框架的工作负载套件。&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/brianfrankcooper/YCSB" target="_blank" rel="noopener"
 &gt;Yahoo Cloud Serving Benchmark&lt;/a&gt;：面向云数据库和 NoSQL 系统的工作负载生成与评测框架。&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>