<?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/05-experiment-design/</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/05-experiment-design/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>单变量与对照组</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/01-single-variable/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/01-single-variable/</guid>
      <description>&lt;h1 id=&#34;51-单变量与对照组&#34;&gt;5.1 单变量与对照组&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：无　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/02-warmup-and-duration/&#34;&gt;5.2 预热、稳态与运行时长&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/05-experiment-design/01-single-variable/&#34;&gt;05-experiment-design/01-single-variable&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;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用试药理解单变量&#34;&gt;一、用「试药」理解单变量&lt;/h2&gt;
&lt;p&gt;假设一个病人吃了三种药，病好了。哪种药起了作用？&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;strong&gt;自愈&lt;/strong&gt;（和药无关）。&lt;/li&gt;
&lt;/ul&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;随机对照试验（RCT）&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;/code&gt;&lt;/pre&gt;&lt;/div&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;/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;/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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：性能实验里的「安慰剂效应」同样存在——&lt;strong&gt;你自己的期望会影响你怎么配置环境、怎么解读数据&lt;/strong&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;/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;commit hash、依赖版本、构建产物&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;JVM&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;JDK 版本、完整启动参数（堆、GC、其他 &lt;code&gt;-XX&lt;/code&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;实例规格、CPU 型号、是否容器、容器 limit&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;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;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;这张表就是第 1 章 1.7 节「实验元数据」的完整版&lt;/strong&gt;。任何一项变了，实验就不是单变量的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三四种常见的伪单变量实验&#34;&gt;三、四种常见的「伪单变量」实验&lt;/h2&gt;
&lt;h3 id=&#34;-同时改代码和-jvm-参数&#34;&gt;❶ 同时改代码和 JVM 参数&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;❌ 实验：把 -Xmx 从 2g 改成 4g，同时加了一个索引
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   结果：P99 降了 40%
&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;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/05-experiment-design/02-warmup-and-duration/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/02-warmup-and-duration/</guid>
      <description>&lt;h1 id=&#34;52-预热稳态与运行时长&#34;&gt;5.2 预热、稳态与运行时长&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/01-single-variable/&#34;&gt;5.1 单变量与对照组&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/03-repetition-and-outliers/&#34;&gt;5.3 重复、抖动与异常值&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/05-experiment-design/02-warmup-and-duration/&#34;&gt;05-experiment-design/02-warmup-and-duration&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; 你必须至少覆盖一个完整的最长周期——GC 老年代回收周期、缓存 TTL、定时任务间隔、连接池回收周期。&lt;strong&gt;30 秒的压测结论只能当烟雾测试。&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;th&gt;对应&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;前 2 分钟&lt;/td&gt;
					&lt;td&gt;水还没开，米是硬的&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;冷启动&lt;/strong&gt;：JIT 未编译、连接池空、缓存冷&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;中间 10 分钟&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;最后 5 分钟&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;/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;「尝一口」不能判断饭好了没&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;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;-错误做法固定预热-n-轮或-n-秒&#34;&gt;❌ 错误做法：固定预热 N 轮或 N 秒&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;「JMH 默认预热 5 轮，那就够了。」
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;「压测前先跑 60 秒预热。」
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么错&lt;/strong&gt;：不同应用需要的预热量差几十倍。一个启动加载 500 个类的应用，和一个 20 个类的工具，不可能同时进入稳态。&lt;/p&gt;
&lt;h3 id=&#34;-正确做法看方差收敛滚动-cv&#34;&gt;✅ 正确做法：看方差收敛（滚动 CV）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;已在第 2 章 2.4 节详述&lt;/strong&gt;。核心判据：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;CV（变异系数）&lt;/th&gt;
					&lt;th&gt;判断&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;gt; 10%&lt;/td&gt;
					&lt;td&gt;明显没稳，继续预热&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;5% – 10%&lt;/td&gt;
					&lt;td&gt;接近稳态，再等等&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&amp;lt; 5%&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;可以开始测量&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;lt; 2%&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;（JVM 之外还有）：&lt;/p&gt;</description>
    </item>
    <item>
      <title>重复、抖动与异常值</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/03-repetition-and-outliers/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/03-repetition-and-outliers/</guid>
      <description>&lt;h1 id=&#34;53-重复抖动与异常值&#34;&gt;5.3 重复、抖动与异常值&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/02-warmup-and-duration/&#34;&gt;5.2 预热、稳态与运行时长&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/04-environment-isolation/&#34;&gt;5.4 环境隔离清单&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/05-experiment-design/03-repetition-and-outliers/&#34;&gt;05-experiment-design/03-repetition-and-outliers&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; 你至少需要 3–5 轮重复才能看到分布。而&lt;strong&gt;异常值不能&amp;quot;觉得不好看就删&amp;quot;&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;只投 1 次（进了）&lt;/td&gt;
					&lt;td&gt;可能是运气&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;只投 1 次（没进）&lt;/td&gt;
					&lt;td&gt;也可能是运气&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;投 100 次&lt;/td&gt;
					&lt;td&gt;开始有意义&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;投 100 次，但把没进的都算作&amp;quot;手滑了&amp;quot;&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;❌ 「跑了一次，P99 = 95ms，达标」
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;✅ 「跑了 5 次，P99 = 93, 96, 94, 210, 95 ms，中位数 95ms」
&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;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;1 轮&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;3 轮&lt;/strong&gt;&lt;/td&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;5 轮&lt;/td&gt;
					&lt;td&gt;能做简单的统计检验（非参数检验需要足够样本）&lt;/td&gt;
					&lt;td&gt;时间成本&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;10 轮以上&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;：3–5 轮是性价比最高的区间。&lt;strong&gt;如果环境噪声大（CV &amp;gt; 10%），增加轮数的收益不如先改善环境。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>环境隔离清单</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/04-environment-isolation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/04-environment-isolation/</guid>
      <description>&lt;h1 id=&#34;54-环境隔离清单&#34;&gt;5.4 环境隔离清单&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/03-repetition-and-outliers/&#34;&gt;5.3 重复、抖动与异常值&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/05-dataset-design/&#34;&gt;5.5 数据集设计&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/05-experiment-design/04-environment-isolation/&#34;&gt;05-experiment-design/04-environment-isolation&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;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;/td&gt;
					&lt;td&gt;独占的测试机器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;恒温恒湿&lt;/td&gt;
					&lt;td&gt;固定的 CPU 频率、无降频&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;tr&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;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键差异&lt;/strong&gt;：化学实验的污染通常是可见的（溶液变色），&lt;strong&gt;性能实验的污染是不可见的&lt;/strong&gt;——你只会看到一个稍微高一点的 P99，然后开始怀疑代码。&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;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;互相抢 CPU，两个方向都失真&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;必须分离&lt;/strong&gt;（最低要求：不同容器 + CPU 限制）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;IDE / 浏览器 / 本地开发&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;争抢资源&lt;/td&gt;
					&lt;td&gt;独占环境&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;监控 agent&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;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;数据库 autovacuum&lt;/td&gt;
					&lt;td&gt;不定&lt;/td&gt;
					&lt;td&gt;磁盘 IO 尖刺&lt;/td&gt;
					&lt;td&gt;实验前手动 &lt;code&gt;VACUUM ANALYZE&lt;/code&gt;，期间可临时调整 &lt;code&gt;autovacuum&lt;/code&gt; 参数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据库 checkpoint&lt;/td&gt;
					&lt;td&gt;不定&lt;/td&gt;
					&lt;td&gt;IO 抖动&lt;/td&gt;
					&lt;td&gt;观察 checkpoint 配置与日志时间戳&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;全盘 IO 与网络&lt;/td&gt;
					&lt;td&gt;实验前确认已关闭&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;cron&lt;/code&gt; / 定时任务&lt;/td&gt;
					&lt;td&gt;各种&lt;/td&gt;
					&lt;td&gt;周期性 CPU/IO&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;pgrep -a -f cron&lt;/code&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;突发 CPU/IO&lt;/td&gt;
					&lt;td&gt;关闭自动更新&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;-cpu-频率与调度&#34;&gt;❸ CPU 频率与调度&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;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;CPU governor（节能模式）&lt;/td&gt;
					&lt;td&gt;频率波动 → 延迟抖动&lt;/td&gt;
					&lt;td&gt;设为 &lt;code&gt;performance&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Turbo Boost&lt;/td&gt;
					&lt;td&gt;前后跑的基准频率不同&lt;/td&gt;
					&lt;td&gt;要么固定频率，要么全程接受 turbo（关键是&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;/td&gt;
					&lt;td&gt;&lt;code&gt;taskset&lt;/code&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;NUMA 跨节点&lt;/td&gt;
					&lt;td&gt;内存访问变慢&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;numactl&lt;/code&gt; 绑定&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&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;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;邻居抢占（steal）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;st&lt;/code&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;跨 AZ 调用延迟变化&lt;/td&gt;
					&lt;td&gt;固定可用区；记录网络拓扑&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;存储 IOPS 配额&lt;/td&gt;
					&lt;td&gt;IO 突发受限&lt;/td&gt;
					&lt;td&gt;确认卷类型与 IOPS 上限&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;/tbody&gt;
&lt;/table&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;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;高开销剖析（profiler）&lt;/td&gt;
					&lt;td&gt;占用 CPU，抬高 P99&lt;/td&gt;
					&lt;td&gt;基线组和实验组&lt;strong&gt;必须用同样的观测配置&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;详细日志（DEBUG）&lt;/td&gt;
					&lt;td&gt;同步 IO，可能占 10%+&lt;/td&gt;
					&lt;td&gt;统一日志级别&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/metrics&lt;/code&gt; 高频抓取&lt;/td&gt;
					&lt;td&gt;序列化开销&lt;/td&gt;
					&lt;td&gt;统一 scrape interval&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;strong&gt;先验证到达率&lt;/strong&gt;（第 4 章 4.1）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&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; CPU governor = performance
&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;`ps aux --sort=-%cpu | head`&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;`st`&lt;/span&gt;（steal）&amp;lt; 1%（多次采样确认）
&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; CPU limit 与生产一致
&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; 内存 limit 与生产一致
&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; 无 sidecar 干扰（或已计入）
&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; 节流比例 &amp;lt; 1%（&lt;span style=&#34;color:#e6db74&#34;&gt;`/sys/fs/cgroup/cpu.stat`&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; autovacuum 状态已知（关闭或已记录）
&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;`pg_stat_activity`&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;`ANALYZE`&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; JVM 参数与生产一致
&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; 观测配置一致（JFR/profiler）
&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&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; 环境元数据已采集（第 1 章 1.7）
&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;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-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;# ① 固定 CPU 频率（Linux）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo cpupower frequency-set -g performance
&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;cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
&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;# ② 绑定到指定核（服务用 2-5，压测客户端用 6-7，互不干扰）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;taskset -c 2-5 java -jar app.jar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;taskset -c 6-7 k6 run loadtest.js
&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;# ③ NUMA 绑定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;numactl --cpunodebind&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; --membind&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; java -jar app.jar
&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;# ④ 查看 NUMA 拓扑&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;numactl --hardware
&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;# ⑤ 容器内限制 JVM 看到的核数（避免线程池过大）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;java -XX:ActiveProcessorCount&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; -jar app.jar
&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;# ⑥ 关闭 swap（避免内存压力导致的抖动）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo swapoff -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&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;</description>
    </item>
    <item>
      <title>数据集设计</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/05-dataset-design/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/05-dataset-design/</guid>
      <description>&lt;h1 id=&#34;55-数据集设计&#34;&gt;5.5 数据集设计&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/04-environment-isolation/&#34;&gt;5.4 环境隔离清单&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/06-statistics-basics/&#34;&gt;5.6 统计基础&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/05-experiment-design/05-dataset-design/&#34;&gt;05-experiment-design/05-dataset-design&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;/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;身高 175、三围标准&lt;/td&gt;
					&lt;td&gt;身高 150–195，各种体型&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;/p&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;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;用 1 万行测，线上 1 亿行&lt;/td&gt;
					&lt;td&gt;执行计划不同（索引 vs 全表扫描）&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;上线后冷启动的 P99 是热态的几十倍&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二规模为什么同数量级不够要同级&#34;&gt;二、规模：为什么「同数量级」不够，要「同级」&lt;/h2&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;PostgreSQL 可能选择&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;全表扫描（反正很快）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;10 万行&lt;/td&gt;
					&lt;td&gt;索引扫描&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;1 亿行&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; 你可能在 10 万行时看到「走索引、P99 = 5 ms」，在 1 亿行时完全一样；但也可能在 100 万行时突然因为统计信息或选择性变化而改走全表扫描。&lt;/p&gt;</description>
    </item>
    <item>
      <title>统计基础（够用版）</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/06-statistics-basics/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/06-statistics-basics/</guid>
      <description>&lt;h1 id=&#34;56-统计基础够用版&#34;&gt;5.6 统计基础（够用版）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/05-dataset-design/&#34;&gt;5.5 数据集设计&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/07-noise-floor-and-regression/&#34;&gt;5.7 噪声底线与回归检测&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/05-experiment-design/06-statistics-basics/&#34;&gt;05-experiment-design/06-statistics-basics&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;：变异系数（CV，衡量数据稳不稳）、置信区间（衡量估计有多准）、&lt;strong&gt;非参数检验&lt;/strong&gt;（判断两组差异是否真实）。&lt;strong&gt;不要用 t 检验&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;p &amp;lt; 0.01&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;「证据充分」&lt;/td&gt;
					&lt;td&gt;p &amp;lt; 0.05&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;「证据不足」&lt;/td&gt;
					&lt;td&gt;p &amp;gt; 0.05&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;二工具一变异系数cv衡量数据稳不稳&#34;&gt;二、工具一：变异系数（CV）——衡量数据稳不稳&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CV = 标准差 / 均值
&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;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;CV&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;&amp;lt; 3%&lt;/td&gt;
					&lt;td&gt;环境很干净&lt;/td&gt;
					&lt;td&gt;可以做细微差异的判断&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3% – 5%&lt;/td&gt;
					&lt;td&gt;可接受&lt;/td&gt;
					&lt;td&gt;常规结论可信&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;5% – 10%&lt;/td&gt;
					&lt;td&gt;偏大&lt;/td&gt;
					&lt;td&gt;只能判断较大差异（&amp;gt; 10%）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;gt; 10%&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;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;关键理解cv-是你的尺子的精度&#34;&gt;关键理解：CV 是「你的尺子的精度」&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;如果你的 CV 是 8%，那么：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  5% 的「优化」→ 无法确认（在噪声范围内）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  30% 的「优化」→ 可以确认
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;这就是第 7 节「噪声底线」的核心&lt;/strong&gt;：CV 决定了你能声称的最小差异。&lt;/p&gt;</description>
    </item>
    <item>
      <title>噪声底线与回归检测</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/07-noise-floor-and-regression/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/07-noise-floor-and-regression/</guid>
      <description>&lt;h1 id=&#34;57-噪声底线与回归检测&#34;&gt;5.7 噪声底线与回归检测&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/06-statistics-basics/&#34;&gt;5.6 统计基础&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/08-records-and-antipatterns/&#34;&gt;5.8 实验记录与常见反模式&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/05-experiment-design/07-noise-floor-and-regression/&#34;&gt;05-experiment-design/07-noise-floor-and-regression&lt;/a&gt;
&lt;strong&gt;本节是本章的核心。&lt;/strong&gt; 它回答一个问题：&lt;strong&gt;在你的环境里，多大的差异才算「真实差异」？&lt;/strong&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;低于噪声底线的&amp;quot;优化&amp;quot;，无论听起来多合理，都无法被你的数据证实。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用体重秤的精度理解噪声底线&#34;&gt;一、用「体重秤的精度」理解噪声底线&lt;/h2&gt;
&lt;p&gt;你家的体重秤有 ±0.5 kg 的误差。今天称是 70.0 kg，明天是 69.7 kg。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;你能说「我减了 0.3 kg 吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不能&lt;/strong&gt;——因为 0.3 kg 小于秤的精度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;正确说法&lt;/strong&gt;：「在秤的精度范围内，体重没有变化。」&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;如果你的环境噪声底线是 ±8%：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  P99 从 210ms 到 198ms（-5.7%） → ❌ 无法确认
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  P99 从 210ms 到 150ms（-28.6%）→ ✅ 可以确认
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：噪声底线&lt;strong&gt;不是「你可能做到多精确」，而是「你的工具实际有多精确」&lt;/strong&gt;。它由环境（云主机、后台任务、GC 抖动）决定，不由你的意愿决定。&lt;/p&gt;
&lt;/blockquote&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-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;③ 完整跑一次实验（含预热），记录 P50/P95/P99、QPS、错误率
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;④ 重复 5–10 次（每次都重启 + 预热）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;⑤ 计算每个指标的均值、标准差、CV
&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;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;/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;tr&gt;
					&lt;td&gt;&lt;strong&gt;至少 5 次&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;3 次看不出分布形态，5 次能看出基本范围&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;记录每一轮的值&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;不只看 CV，还要看是否有趋势（是否在变好/变坏）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&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;═══ 噪声底线测量（10 轮，代码未改动）═══
&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;轮次  QPS     P50    P95    P99    错误率
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   1  498.2   32.1   68.4   93.2   0.00%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   2  499.1   33.0   70.2   96.1   0.00%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   3  497.5   32.4   67.9   94.0   0.00%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   4  498.8   34.2   74.1  103.5   0.00%   ← 偏高
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   5  499.4   32.8   69.3   95.2   0.00%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   6  498.0   32.5   68.8   94.4   0.00%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   7  499.7   33.1   70.5   96.8   0.00%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   8  498.3   32.9   69.1   95.0   0.00%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   9  499.2   32.6   68.2   93.8   0.00%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  10  498.6   33.3   71.0   97.2   0.00%
&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;指标   中位数   最小值   最大值   波动范围   CV
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPS    498.8   497.5   499.7    ±0.22%    0.13%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;P50     32.8    32.1    34.2    ±3.2%     1.8%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;P95     69.2    67.9    74.1    ±4.5%     2.7%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;P99     95.1    93.2   103.5    ±5.4%     3.1%
&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;噪声底线（取最大波动范围的 1.5 倍作为安全边际）：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  QPS : ±0.3%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  P50 : ±5%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  P95 : ±7%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  P99 : ±8%
&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;  优化声称 P99 改善 &amp;lt; 8%  → 无法确认
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  优化声称 P50 改善 &amp;lt; 5%  → 无法确认
&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;优化前 P99 中位数 = 210 ms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;优化后 P99 中位数 = 195 ms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;差异 = -7.1%
&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;噪声底线 = ±8%
&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;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/05-experiment-design/08-records-and-antipatterns/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/08-records-and-antipatterns/</guid>
      <description>&lt;h1 id=&#34;58-实验记录与常见反模式&#34;&gt;5.8 实验记录与常见反模式&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/07-noise-floor-and-regression/&#34;&gt;5.7 噪声底线与回归检测&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/09-lab5/&#34;&gt;5.9 Lab 5&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/05-experiment-design/08-records-and-antipatterns/&#34;&gt;05-experiment-design/08-records-and-antipatterns&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;实验记录的目的不是&amp;quot;存档&amp;quot;，而是&amp;quot;让三个月后的你或另一个人能复现出同样的结论&amp;quot;。&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;已在第 1 章和 &lt;code&gt;docs/experiments/_TEMPLATE/&lt;/code&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;strong&gt;轮数与每轮结果&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;单次结果不是结论（第 3 节）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;CV 与噪声底线&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;判断差异是否可信的标尺（第 7 节）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;统计检验结果&lt;/strong&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;解释异常轮的依据（第 3 节）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&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-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;### 环境（12 轮实验期间）
&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）：±8%（CV 3.1%，见 E05-noise 实验）
&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; 环境事件：T+15min 有一次日志轮转（已记录，未造成异常）
&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;| 轮次 | QPS | P50 | P95 | P99 | 错误率 | 备注 |
&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 | 498 | 32.1 | 68.4 | 93.2 | 0.00% | |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| 2 | 499 | 33.0 | 70.2 | 96.1 | 0.00% | |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| 3 | 497 | 32.4 | 67.9 | 94.0 | 0.00% | |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| 4 | 498 | 34.2 | 74.1 | 103.5 | 0.00% | ⚠️ 日志轮转期间 |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| 5 | 499 | 32.8 | 69.3 | 95.2 | 0.00% | |
&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; P99 中位数：95.2 ms（全部 5 轮）/ 94.6 ms（剔除第 4 轮）
&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; 四分位距：93.8 – 96.1 ms
&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; CV（轮间）：3.1%
&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; 与基线（E03 的 210 ms）对比：Mann-Whitney U，p = 0.008 → 显著
&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; 差异幅度：-55%（远大于噪声底线 8% 和 MDD 16%）
&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;优化有效。P99 从 210 ms 降到 95 ms，改善 55%，统计显著且远超噪声底线。
&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;-cherry-picking挑好看的一次&#34;&gt;❶ Cherry-picking（挑好看的一次）&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;❌ 「我们测了 5 次，最好的那次 P99 是 88 ms，达标了。」
&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;/p&gt;</description>
    </item>
    <item>
      <title>Lab 5：量化你自己的噪声底线</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/09-lab5/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/09-lab5/</guid>
      <description>&lt;h1 id=&#34;59-lab-5量化你自己的噪声底线&#34;&gt;5.9 Lab 5：量化你自己的噪声底线&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/08-records-and-antipatterns/&#34;&gt;5.8 实验记录与常见反模式&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/06-analysis-and-profiling/&#34;&gt;第 6 章 分析与定位&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/05-experiment-design/09-lab5/&#34;&gt;05-experiment-design/09-lab5&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;/p&gt;
&lt;p&gt;做完之后你会得到一个数字——&lt;strong&gt;低于这个数字的&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;1&lt;/td&gt;
					&lt;td&gt;冻结环境（按第 4 节清单）&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;跑 10 轮相同配置实验&lt;/td&gt;
					&lt;td&gt;10 组原始数据&lt;/td&gt;
					&lt;td&gt;40 min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;计算噪声底线与 MDD&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;4&lt;/td&gt;
					&lt;td&gt;显著性验证（5% 与 30% 两个改动）&lt;/td&gt;
					&lt;td&gt;两次判定结论&lt;/td&gt;
					&lt;td&gt;15 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;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/05-experiment-design/04-environment-isolation/&#34;&gt;第 4 节&lt;/a&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-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:#66d9ef&#34;&gt;-&lt;/span&gt; CPU governor: &lt;span style=&#34;font-weight:bold&#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;font-weight:bold&#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; 容器 CPU limit: &lt;span style=&#34;font-weight:bold&#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; 容器内存 limit: &lt;span style=&#34;font-weight:bold&#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;font-weight:bold&#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; 数据库 autovacuum 状态已知
&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; JVM 参数: &lt;span style=&#34;font-weight:bold&#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; 观测配置（JFR/profiler）: &lt;span style=&#34;font-weight:bold&#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;`st`&lt;/span&gt;（steal）采样值: &lt;span style=&#34;font-weight:bold&#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;实验期间（10 轮）不做任何改动&lt;/strong&gt;——包括不调参数、不部署、不打开 IDE。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
