<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>持续化 on Dorkytiger 的小屋</title>
    <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/</link>
    <description>Recent content in 持续化 on Dorkytiger 的小屋</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <atom:link href="https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>为什么需要门禁</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/01-why-gates/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/01-why-gates/</guid>
      <description>&lt;h1 id=&#34;81-为什么需要门禁&#34;&gt;8.1 为什么需要门禁&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：无　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/02-ci-benchmark-gate/&#34;&gt;8.2 CI 微基准门禁&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/08-continuous-performance/01-why-gates/&#34;&gt;08-continuous-performance/01-why-gates&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;90% 的性能问题不是「某次大改搞坏了」，而是「几十次小改动各退化 3%，累积起来翻了一倍」。&lt;/strong&gt; 这种退化&lt;strong&gt;逃过所有人工评审&lt;/strong&gt;（因为每次都在噪声范围内），只有&lt;strong&gt;自动化的门禁&lt;/strong&gt;能发现它。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用慢性病理解渐进退化&#34;&gt;一、用「慢性病」理解渐进退化&lt;/h2&gt;
&lt;p&gt;一次急性心梗，你会立刻去医院。但&lt;strong&gt;高血压、高血脂、血糖偏高&lt;/strong&gt;——每年只涨一点，你毫无感觉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;十年后&lt;/strong&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;/td&gt;
					&lt;td&gt;线上故障 → 立刻排查（第 6 章）&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;strong&gt;门禁 + 趋势监控（本章）&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;血压 &amp;gt; 140 就干预&lt;/td&gt;
					&lt;td&gt;微基准退化 &amp;gt; 15% 就失败&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&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;&lt;strong&gt;关键&lt;/strong&gt;：&lt;strong&gt;急性病靠医生，慢性病靠机制。&lt;/strong&gt; 性能工作的大部分价值在后者。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二渐进退化的四种典型来源&#34;&gt;二、渐进退化的四种典型来源&lt;/h2&gt;
&lt;h3 id=&#34;-新增功能带来的额外工作&#34;&gt;❶ 新增功能带来的额外工作&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;v2.3：新增&amp;#34;用户画像&amp;#34;接口，每次请求多查一次数据库
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     → 订单接口的 P99 从 95ms 涨到 101ms（+6%）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     → 在噪声范围内，code review 也看不出来
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么难发现&lt;/strong&gt;：加一次查询看起来&amp;quot;很合理&amp;quot;，而且只涨 6%。&lt;/p&gt;
&lt;h3 id=&#34;-数据量增长&#34;&gt;❷ 数据量增长&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;v2.3 时：订单表 100 万行，某查询走索引，8ms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;v2.8 时：订单表 800 万行，同一个查询因为统计信息/选择性变化
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         改走全表扫描，45ms（+460%）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么难发现&lt;/strong&gt;：代码一行没改，是&lt;strong&gt;数据让执行计划变了&lt;/strong&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>CI 微基准门禁</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/02-ci-benchmark-gate/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/02-ci-benchmark-gate/</guid>
      <description>&lt;h1 id=&#34;82-ci-微基准门禁&#34;&gt;8.2 CI 微基准门禁&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/01-why-gates/&#34;&gt;8.1 为什么需要门禁&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/03-e2e-perf-gate/&#34;&gt;8.3 全链路性能门禁&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/08-continuous-performance/02-ci-benchmark-gate/&#34;&gt;08-continuous-performance/02-ci-benchmark-gate&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CI 门禁的三条设计纪律：相对比较（不设绝对阈值）、宽松阈值（高于噪声底线）、先报告后失败。&lt;/strong&gt; 违反任何一条，门禁都会沦为「重跑一下就过」的噪声源。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用体重秤的警报理解阈值&#34;&gt;一、用「体重秤的警报」理解阈值&lt;/h2&gt;
&lt;p&gt;你家的体重秤误差是 &lt;strong&gt;±1 kg&lt;/strong&gt;。你设了一个警报：「体重涨了 0.5 kg 就提醒我」。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结果&lt;/strong&gt;：警报天天响（因为噪声就有 1 kg），三天后你就把它关掉了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;正确做法&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;① 先测出秤的实际误差（±1 kg）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;② 警报阈值设成 2 kg（误差的 2 倍）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;③ 只有真的涨了 2 kg 才提醒
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;CI 门禁完全一样&lt;/strong&gt;：&lt;strong&gt;阈值必须高于噪声，否则就会被忽略。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二三条设计纪律&#34;&gt;二、三条设计纪律&lt;/h2&gt;
&lt;h3 id=&#34;纪律一相对比较不设绝对阈值&#34;&gt;纪律一：相对比较，不设绝对阈值&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ❌ 绝对阈值：换 runner 型号就全线失败&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Check performance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    SCORE=$(read_score)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    if [ &amp;#34;$SCORE&amp;#34; -lt 16000 ]; then exit 1; fi   # 硬编码数字&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ✅ 相对比较：与仓库中的基线比&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Compare against baseline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;run&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;python3 tools/compare_benchmark.py current.json perf/baseline.json --threshold 0.15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么&lt;/strong&gt;：CI runner 的型号、负载、邻居会变化，绝对阈值意味着&lt;strong&gt;每次换环境都要重调&lt;/strong&gt;，而且&lt;strong&gt;调的过程中会放松阈值&lt;/strong&gt;（最终变成形式主义）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>全链路性能门禁</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/03-e2e-perf-gate/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/03-e2e-perf-gate/</guid>
      <description>&lt;h1 id=&#34;83-全链路性能门禁&#34;&gt;8.3 全链路性能门禁&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/02-ci-benchmark-gate/&#34;&gt;8.2 CI 微基准门禁&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/04-production-observability/&#34;&gt;8.4 生产观测：SLI 与错误预算&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/08-continuous-performance/03-e2e-perf-gate/&#34;&gt;08-continuous-performance/03-e2e-perf-gate&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;全链路门禁成本高、噪声大，所以它不该出现在每个 PR 上。&lt;/strong&gt; 正确的定位是：&lt;strong&gt;发布前的最后一道验收&lt;/strong&gt;——用专用环境、固定机器、触发式运行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用飞机试飞理解全链路门禁&#34;&gt;一、用「飞机试飞」理解全链路门禁&lt;/h2&gt;
&lt;p&gt;汽车出厂前会做&lt;strong&gt;路试&lt;/strong&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;/td&gt;
					&lt;td&gt;&lt;strong&gt;台架试验&lt;/strong&gt;（对应微基准）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;整车装配完成&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;转鼓试验&lt;/strong&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;strong&gt;路试&lt;/strong&gt;（对应全链路门禁）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;上市后&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;用户反馈 + 定期检查&lt;/strong&gt;（对应生产告警）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;全链路门禁的定位就是「出厂前路试」&lt;/strong&gt;——不是每次都做，但&lt;strong&gt;发布前必做&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二什么时候跑全链路门禁&#34;&gt;二、什么时候跑全链路门禁&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;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;每个 PR&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;比 PR 好，但仍是高频&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;发布候选（RC）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✅ &lt;strong&gt;推荐&lt;/strong&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;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;推荐组合&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;① 主干合并后：跑【微基准门禁】（分钟级）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;② 每日夜间：跑【全链路回归】（发现趋势退化）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;③ 发布候选：跑【全链路门禁 + 容量复测】（发布前验收）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;④ 重大架构改动：手动触发
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;三全链路门禁的三个必要条件&#34;&gt;三、全链路门禁的三个必要条件&lt;/h2&gt;
&lt;h3 id=&#34;条件一专用环境&#34;&gt;条件一：专用环境&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;不能在共享的 CI runner 上跑全链路压测&lt;/strong&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>生产观测：SLI 与错误预算</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/04-production-observability/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/04-production-observability/</guid>
      <description>&lt;h1 id=&#34;84-生产观测sli-与错误预算&#34;&gt;8.4 生产观测：SLI 与错误预算&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/03-e2e-perf-gate/&#34;&gt;8.3 全链路性能门禁&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/05-alerting/&#34;&gt;8.5 告警设计：燃烧率与领先指标&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/08-continuous-performance/04-production-observability/&#34;&gt;08-continuous-performance/04-production-observability&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;错误预算（Error Budget）= 性能的「流量套餐」。&lt;/strong&gt; 如果 SLO 是 99.9%，那么每月有 0.1% 的请求「允许违约」——这个额度用完了，就该停止发布新功能，先修稳定性。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用手机流量套餐理解错误预算&#34;&gt;一、用「手机流量套餐」理解错误预算&lt;/h2&gt;
&lt;p&gt;你每月有 &lt;strong&gt;10 GB&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;用了 3 GB&lt;/td&gt;
					&lt;td&gt;随便用，不用担心&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;用了 7 GB&lt;/td&gt;
					&lt;td&gt;开始留意，但还能用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;用了 9.5 GB&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;strong&gt;限速，或者买加量包&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;错误预算完全一样&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SLO = 99.9%（30 天窗口）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ 错误预算 = 0.1% 的请求可以违约
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ 按 100 万请求/天算，30 天共 3000 万请求
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ 预算 = 3 万个请求可以失败
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;用了 1 万（33%）→ 健康，正常发布
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;用了 2.4 万（80%）→ 警告，谨慎发布
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;用了 3 万（100%）→ 冻结发布，先修稳定性
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键洞察&lt;/strong&gt;：&lt;strong&gt;错误预算把「性能」变成了一个可以量化管理的资源&lt;/strong&gt;——而不是一个模糊的「要快、要稳」。&lt;/p&gt;</description>
    </item>
    <item>
      <title>告警设计：燃烧率与领先指标</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/05-alerting/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/05-alerting/</guid>
      <description>&lt;h1 id=&#34;85-告警设计燃烧率与领先指标&#34;&gt;8.5 告警设计：燃烧率与领先指标&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/04-production-observability/&#34;&gt;8.4 生产观测：SLI 与错误预算&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/06-traffic-replay-and-canary/&#34;&gt;8.6 流量回放与金丝雀发布&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/08-continuous-performance/05-alerting/&#34;&gt;08-continuous-performance/05-alerting&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;告警的目标不是「发现所有异常」，而是「发现值得人介入的异常」。&lt;/strong&gt; 因此：&lt;strong&gt;用燃烧率代替瞬时阈值&lt;/strong&gt;（避免误报）、&lt;strong&gt;用饱和度作为领先指标&lt;/strong&gt;（更早发现）、&lt;strong&gt;每条告警都配 runbook&lt;/strong&gt;（否则只是制造焦虑）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用火灾报警理解告警设计&#34;&gt;一、用「火灾报警」理解告警设计&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;&lt;strong&gt;有烟就响&lt;/strong&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;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;第二种设计的两个要点&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;看&amp;quot;速率&amp;quot;而不是&amp;quot;瞬时值&amp;quot;&lt;/strong&gt;——浓度上升快才是危险。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多传感器交叉验证&lt;/strong&gt;——烟 + 温升同时满足才报警。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;告警设计完全一样&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;❌ P99 &amp;gt; 200ms → 告警       （看瞬时值，天天响）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;✅ 燃烧率 &amp;gt; 14.4 → 告警      （看消耗速度 + 双窗口交叉验证）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;二燃烧率告警错误预算的核心用法&#34;&gt;二、燃烧率告警（错误预算的核心用法）&lt;/h2&gt;
&lt;h3 id=&#34;什么是燃烧率&#34;&gt;什么是燃烧率&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;燃烧率 = 当前错误率 / 允许的错误率
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;例：SLO = 99.9% → 允许错误率 = 0.1%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    当前错误率 = 1%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    → 燃烧率 = 1% / 0.1% = 10
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    → 意味着&amp;#34;照这个速度，30 天的预算 3 天就用完了&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;常用的燃烧率阈值&#34;&gt;常用的燃烧率阈值&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;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;14.4&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2 天烧完 30 天预算&lt;/td&gt;
					&lt;td&gt;1 小时 + 5 分钟&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;page（立即叫人）&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;6&lt;/td&gt;
					&lt;td&gt;5 天烧完&lt;/td&gt;
					&lt;td&gt;6 小时 + 30 分钟&lt;/td&gt;
					&lt;td&gt;ticket（工单）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;正好用完&lt;/td&gt;
					&lt;td&gt;3 天&lt;/td&gt;
					&lt;td&gt;观察&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;为什么是 14.4&lt;/strong&gt;：&lt;code&gt;30 天 / (1 小时 / 30 天) ≈ 14.4 × 2&lt;/code&gt;——它保证「1 小时内消耗的预算不超过 2%」，同时能在 2 天内耗尽预算时及时报警。&lt;/p&gt;</description>
    </item>
    <item>
      <title>流量回放与金丝雀发布</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/06-traffic-replay-and-canary/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/06-traffic-replay-and-canary/</guid>
      <description>&lt;h1 id=&#34;86-流量回放与金丝雀发布&#34;&gt;8.6 流量回放与金丝雀发布&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/05-alerting/&#34;&gt;8.5 告警设计：燃烧率与领先指标&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/07-capacity-planning/&#34;&gt;8.7 容量规划&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/08-continuous-performance/06-traffic-replay-and-canary/&#34;&gt;08-continuous-performance/06-traffic-replay-and-canary&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;流量回放解决「人造流量不像真实流量」，金丝雀解决「上线后才发现问题」。&lt;/strong&gt; 两者配合：&lt;strong&gt;回放做上线前的验证，金丝雀做上线时的保护&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用彩排和矿井金丝雀理解这两件事&#34;&gt;一、用「彩排」和「矿井金丝雀」理解这两件事&lt;/h2&gt;
&lt;h3 id=&#34;流量回放--彩排&#34;&gt;流量回放 = 彩排&lt;/h3&gt;
&lt;p&gt;话剧正式演出前会&lt;strong&gt;彩排&lt;/strong&gt;：用真实的剧本、真实的走位、真实的灯光。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但有一条铁律&lt;/strong&gt;：&lt;strong&gt;彩排时演员不能真的受伤&lt;/strong&gt;（道具刀是假的）。对应到后端：&lt;strong&gt;回放时不能让写操作污染生产数据&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;金丝雀--矿井里的金丝雀&#34;&gt;金丝雀 = 矿井里的金丝雀&lt;/h3&gt;
&lt;p&gt;旧时矿工会带一只金丝雀下矿。&lt;strong&gt;金丝雀对瓦斯更敏感&lt;/strong&gt;——它先倒下，矿工就知道要撤。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：&lt;strong&gt;金丝雀是&amp;quot;小范围先试&amp;quot;，而不是&amp;quot;全量上线后观察&amp;quot;&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二流量回放的四种数据来源&#34;&gt;二、流量回放的四种数据来源&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;&lt;strong&gt;生产访问日志回放&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;高（真实分布）&lt;/td&gt;
					&lt;td&gt;中（要脱敏、要处理写操作）&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;推荐&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;生产 trace 回放&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;高（需要 tracing 系统）&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;低&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;低&lt;/td&gt;
					&lt;td&gt;❌ 容易失真（第 5.5 节）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;为什么推荐访问日志&lt;/strong&gt;：它天然包含&lt;strong&gt;真实的访问分布&lt;/strong&gt;（幂律热点）、真实的参数、真实的时序。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 从 PostgreSQL 导出真实的 ID 访问分布&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;psql -tAc &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;SELECT user_id FROM request_log
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;WHERE created_at &amp;gt; now() - interval &amp;#39;1 day&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ORDER BY random() LIMIT 100000;&amp;#34;&lt;/span&gt; &amp;gt; sampled-ids.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 在 k6 里按这个列表取样（保持真实分布）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# const ids = open(&amp;#39;./sampled-ids.txt&amp;#39;).split(&amp;#39;\n&amp;#39;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# const id = ids[Math.floor(Math.random() * ids.length)];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;三写操作怎么处理最关键的问题&#34;&gt;三、写操作怎么处理（最关键的问题）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;回放写操作会污染数据，而且会累积&lt;/strong&gt;（每次回放都写一遍）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>容量规划</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/07-capacity-planning/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/07-capacity-planning/</guid>
      <description>&lt;h1 id=&#34;87-容量规划&#34;&gt;8.7 容量规划&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/06-traffic-replay-and-canary/&#34;&gt;8.6 流量回放与金丝雀发布&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/08-review-and-org/&#34;&gt;8.8 性能评审与组织落地&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/08-continuous-performance/07-capacity-planning/&#34;&gt;08-continuous-performance/07-capacity-planning&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;容量 = 拐点 × (1 - headroom)，不是「CPU 打满时的 QPS」。&lt;/strong&gt; 而且容量不是一次测完就固定的——&lt;strong&gt;数据量增长、依赖变化、业务形态变化都会移动拐点&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用餐厅订桌理解容量规划&#34;&gt;一、用「餐厅订桌」理解容量规划&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;按「平均每天 50 桌」备料&lt;/td&gt;
					&lt;td&gt;❌ 周末 120 桌时不够&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;按「历史最高 200 桌」备料&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;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;「上座率的临界点」就是拐点&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;60% 上座率 → 服务员从容，出菜快，翻台正常
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;80% 上座率 → 开始排队，出菜变慢
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;95% 上座率 → 厨房崩溃，所有人等很久
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;100%       → 实际上已经瘫痪（等位的人走了，实际营业额反而下降）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;所以备料的目标不是「撑到 100%」，而是「撑到 80% 且留有余量」。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;后端完全一样。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二从拐点到副本数&#34;&gt;二、从拐点到副本数&lt;/h2&gt;
&lt;h3 id=&#34;四步推导&#34;&gt;四步推导&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;① 压测找拐点
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   → 4C8G 单实例在 900 RPS 时 P99 开始非线性上升
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   → 拐点 = 900 RPS
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;② 应用 headroom
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   → 安全容量 = 900 × (1 - 0.4) = 540 RPS
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   → headroom 通常 30%~50%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;③ 按峰值流量计算副本数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   → 峰值 = 3000 RPS
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   → 副本数 = ceil(3000 / 540) = 6
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;④ 加冗余
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   → N+1 冗余（坏一台不影响服务）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   → 最终副本数 = 7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;headroom-该留多少&#34;&gt;headroom 该留多少&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;依据是排队论&lt;/strong&gt;（第 0 章 0.5 节）：&lt;/p&gt;</description>
    </item>
    <item>
      <title>性能评审与组织落地</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/08-review-and-org/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/08-review-and-org/</guid>
      <description>&lt;h1 id=&#34;88-性能评审与组织落地&#34;&gt;8.8 性能评审与组织落地&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/07-capacity-planning/&#34;&gt;8.7 容量规划&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/09-lab8/&#34;&gt;8.9 Lab 8&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/08-continuous-performance/08-review-and-org/&#34;&gt;08-continuous-performance/08-review-and-org&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;技术手段只能解决技术问题，而「性能持续不退化」最终是一个流程问题。&lt;/strong&gt; 需要三样东西：&lt;strong&gt;评审清单&lt;/strong&gt;（把性能纳入 review）、&lt;strong&gt;明确的责任人&lt;/strong&gt;（谁对整体指标负责）、&lt;strong&gt;能被执行的语言&lt;/strong&gt;（用业务方听得懂的方式讲性能）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用起飞前检查单理解评审清单&#34;&gt;一、用「起飞前检查单」理解评审清单&lt;/h2&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;/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;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;事后可追溯&lt;/td&gt;
					&lt;td&gt;&amp;ldquo;这个检查项当时做了吗？&amp;rdquo;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&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;&lt;strong&gt;航空业的经验&lt;/strong&gt;：&lt;strong&gt;清单化的流程比个人能力更可靠。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二性能评审清单新功能上线前&#34;&gt;二、性能评审清单（新功能上线前）&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 性能评审清单
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;### 数据访问
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 这个功能对每个请求增加了多少次 IO / RPC / 序列化？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 有没有循环里的数据库调用（N+1）？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 新增的查询走索引吗？在数据量增长 10 倍后还快吗？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 有没有可以批处理的机会？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;### 资源与边界
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 是否引入了无界的缓存、队列或内存结构？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 新增的缓存/队列有淘汰策略吗？有容量上限吗？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 是否引入了新的线程/协程池？并行度是多少？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 是否引入了新的连接池？它与数据库的 &lt;span style=&#34;color:#e6db74&#34;&gt;`max_connections`&lt;/span&gt; 匹配吗？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;### 超时与失败
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 每个新增的下游调用都有超时吗？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 超时是否小于上游给的预算？（逐层递减）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 超时后是否正确释放资源？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 失败时是快速失败还是排队等待？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 失败会不会放大（重试风暴）？重试有次数上限、退避、抖动吗？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 这个调用是幂等的吗？（决定能否重试）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;### 可观测性
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 新增的接口有延迟、错误率、饱和度指标吗？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 新增的依赖有独立的计时指标吗？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 出现问题时能否回答「这个接口的 P99 里，数据库占多少毫秒」？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 指标标签里有没有无界维度（用户 ID / URL 全路径）？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;### 兼容性与影响
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 这个改动会不会影响其他接口？（性能回归）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 是否改变了共享资源的用量（连接池、线程池、缓存）？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 是否需要更新容量规划？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 是否需要更新 SLO 或告警规则？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;### 验证
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 做了组件基准或集成基准吗？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 关键路径做了性能对比吗？（before/after）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;- [ ]&lt;/span&gt; 引入新组件时做了长稳（浸泡）验证吗？
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意最后一段&lt;/strong&gt;：&lt;strong&gt;验证是清单的一部分&lt;/strong&gt;——不是&amp;quot;有空再做&amp;quot;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lab 8：做一个不会误报的性能门禁</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/09-lab8/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/09-lab8/</guid>
      <description>&lt;h1 id=&#34;89-lab-8做一个不会误报的性能门禁&#34;&gt;8.9 Lab 8：做一个不会误报的性能门禁&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/08-review-and-org/&#34;&gt;8.8 性能评审与组织落地&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/09-capstone/&#34;&gt;第 9 章 综合实战&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/08-continuous-performance/09-lab8/&#34;&gt;08-continuous-performance/09-lab8&lt;/a&gt;
预计时长：&lt;strong&gt;90 分钟&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一这个-lab-的目标&#34;&gt;一、这个 Lab 的目标&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;做一个真正可用的性能门禁&lt;/strong&gt;——它的验收标准只有一条：&lt;strong&gt;在代码不变时，连续跑多次零误报。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;做完之后你会得到一个数字：&lt;strong&gt;在你自己的 CI 环境里，多大的退化才值得失败。&lt;/strong&gt; 这个数字是门禁能否长期存活的关键。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二任务清单&#34;&gt;二、任务清单&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;1&lt;/td&gt;
					&lt;td&gt;选出 3–5 个核心基准&lt;/td&gt;
					&lt;td&gt;基准代码&lt;/td&gt;
					&lt;td&gt;20 min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;在 CI 环境测噪声底线（跑 10 次）&lt;/td&gt;
					&lt;td&gt;噪声数据&lt;/td&gt;
					&lt;td&gt;25 min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;定阈值 + 写比较脚本&lt;/td&gt;
					&lt;td&gt;门禁脚本&lt;/td&gt;
					&lt;td&gt;20 min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;验证零误报（跑 5 次）&lt;/td&gt;
					&lt;td&gt;验证记录&lt;/td&gt;
					&lt;td&gt;15 min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;写告警规则草案&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;alerts.yml&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;10 min&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三任务-1选出核心基准&#34;&gt;三、任务 1：选出核心基准&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;选择原则&lt;/strong&gt;：&lt;strong&gt;纯计算、无外部依赖、在 CI 环境稳定、退化后果严重&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;候选&lt;/th&gt;
					&lt;th&gt;是否适合 CI&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;纯计算&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;/td&gt;
			&lt;/tr&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;影响滚动发布&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;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据库查询&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;CI 环境不稳定&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HTTP 接口&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;&lt;strong&gt;建议的基准集合&lt;/strong&gt;（用一个真实的业务对象）：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
