硬件性能测试这件事,最容易被误解成"跑个分截图发群里"。真正做过整机验收或者排障的人都知道,跑分只是整条链路上最不值钱的那一环。我印象很深的一次,是替一个团队验收一批同型号的机器,跑分差异都在 5% 以内,看起来整齐得很,可实际跑同一个渲染任务,最慢的一台比最快的多花将近三成时间。拆开查下去,内存插在了单通道上、散热策略被设成了静音优先、还装着一个会周期性扫盘的后台服务,三个问题叠在一起,跑分却几乎看不出来。从那次之后我就形成了一个习惯:硬件性能测试的核心不是"测出多高的数值",而是"把不确定变成确定"——先确定这台机器在什么条件下能稳定输出多少,再确定它的瓶颈到底卡在哪个部件上。这篇内容面向的是需要做整机验收、选型对比、故障定位、调优验证的朋友,不管你是刚接触这块的新手,还是已经会用几种压测工具的老手,下面这些关于环境控制、负载模型、数据判读和排错顺序的东西,应该都能直接拿去用。
1. 先把"测什么"想清楚:硬件性能测试的四层目标
很多人拿到一台机器就急着装工具、开跑,结果跑完一堆数据不知道说明什么。硬件性能测试其实是个目标导向很强的活,你带着什么目的去测,决定了你要选什么负载、跑多长时间、看哪些指标。目标不清,测出来的东西就是一堆漂亮但没用的数字。
1.1 验收、定位、调优、回归:四种目标对应四套完全不同的测法
验收型测试关心的是"这批机器是否一致、是否达到采购时约定的水平"。它的重点是横向可比性,所以所有机器必须用完全相同的环境、相同的负载、相同的时长,测完做分布对比,看有没有离群点。这类测试不需要把机器压到极限,反而要克制——你要的是能代表日常负载的场景,而不是让每台机器都跑到冒烟。
定位型测试关心的是"问题出在哪个部件"。它的做法是分而治之:先把 CPU、内存、存储、图形、散热逐个单独施压,得到各自的基线数据,再做组合施压,观察哪个部件在组合场景下掉得最厉害。这类测试最忌讳一上来就上综合压测,因为综合负载下所有部件都在动,你根本分不清是谁拖了后腿。
调优型测试关心的是"改一个参数能带来多少收益"。它要求严格的单变量原则:一次只改一项,改完重测,其余条件全部锁定。这类测试对数据的重复性要求最高,同样的配置至少要跑三轮,取中位数或者看波动范围,否则你根本分不清那 3% 的提升是改配置改出来的还是随机波动。
回归型测试关心的是"改完之后有没有变差"。它的核心是可比性,所以必须建立一份固定的测试脚本和基线数据,每次改动后跑同一套流程,和基线做逐项比对。
四种目标对应的参数设定可以用下表做个粗线条的对照,实际使用时按自己的场景微调:
| 测试目标 | 单轮时长 | 重复次数 | 关键看什么 | 常见错误 |
|---|---|---|---|---|
| 验收 | 10 到 15 分钟 | 每台 2 轮 | 同型号机器之间的离散度 | 环境不统一,机器之间没法比 |
| 定位 | 5 到 10 分钟 | 每项 1 轮 | 单项基线与组合场景的差值 | 直接上综合负载,分不清瓶颈 |
| 调优 | 15 分钟以上 | 至少 3 轮 | 中位数与波动范围 | 多变量同时改,结论不可信 |
| 回归 | 与基线完全一致 | 与基线一致 | 与历史基线的偏差 | 脚本或工具版本悄悄变了 |
这张表看着简单,但真正常年被忽略的是最后一列。我见过太多次"改完之后性能提升了"的结论,结果一查是压测工具的版本升了级,或者测试脚本里少了一个线程数参数。调优型测试尤其要注意这一点,工具链的版本也要一并锁定,并且写进记录里。
1.2 跑分和实际体验对不上的三个典型原因
第一类是持续时间差异。绝大多数跑分工具只跑几十秒到几分钟,这段时间里机器还处在"冲刺模式":功耗上限放开、风扇还没转起来、缓存是热的。而真实任务往往要跑几十分钟甚至几小时,机器会进入"巡航模式",功耗被限制、温度趋于平衡、缓存反复冲刷。这两种状态下的性能可能差出百分之二三十。所以任何短时测试的结果,都只能代表短时性能,不能直接外推到长任务。
第二类是负载特征不匹配。有的负载吃单核频率,有的负载吃全核并行,有的负载吃内存带宽,有的负载吃缓存命中率。同一个跑分工具,可能恰好命中了你实际任务的负载特征,也可能完全错开。比如一个以整数运算为主的跑分,对浮点密集型任务的参考价值就很有限。
第三类是瓶颈位置错位。单部件测试时每个部件都能跑满,看起来都很好;但真实任务里部件是串行协作的,木桶效应非常明显。存储的随机读延迟高一点点,在流水线里被放大之后,整体吞吐可能掉一大截。这就是为什么定位型测试一定要做组合场景。
2. 测试台搭建:控制变量比堆工具更值钱
我见过不少人工具装了一堆,跑出来的数据互相矛盾,最后谁也不敢信。问题几乎都出在环境上。硬件性能测试的可靠性,八成取决于你在开跑之前把多少变量钉死了。
2.1 环境基线清单:把不该变的东西全部钉死
开跑之前,我会列一张清单逐项确认,任何一项没确认就先别测:
- 固件与驱动版本:主板固件、显卡驱动、存储控制器驱动,版本号全部记录。这些版本更新常常带来几个百分点的性能变化,不记录的话后面根本没法归因。
- 电源策略与性能模式:操作系统里是否开启了节能模式、处理器最小状态设成了多少、是否允许降频。这一项对结果的影响经常比硬件本身还大。
- 后台负载:关掉自动更新、索引服务、同步工具、杀毒扫描。做不到完全关闭的,至少要在测试期间暂停,并在报告里写明。
- 散热条件:机器摆放位置、进出风口是否有遮挡、环境温度。环境温度差 5 度,长时间压测的最终频率可能差出好几档。
- 内存插法与通道:插槽位置、通道数、是否开启双通道。这一项是验收时最容易出问题的地方,插错槽位导致单通道,跑分只掉一点点,实际带宽腰斩。
- 虚拟化与超线程状态:开着还是关着,必须固定,并且写明。
提示:环境温度这一项建议用独立温度计记录,不要用机器内部的传感器读数代替。内部传感器本身就受机器自身发热影响,用它来代表环境温度会形成循环论证。
清单确认完,还要做一次"空载基线":机器静置 10 分钟,记录待机功耗、各部件温度、频率。这个数据后面有大用——长稳压测结束后,你要看机器能不能回落到接近这个状态,回落不了说明散热或者功耗管理有问题。
2.2 工具组合:负载、监控、记录三条线要分开
一个常见的错误是把负载工具和监控工具混在一起用,一边压测一边开着图形化的监控面板,结果监控本身消耗了可观的 CPU 和内存,把数据污染了。正确的做法是把三条线分开:
负载线负责施加压力,尽量轻量、尽量无界面。命令行工具优先,图形界面工具在压测期间全部关掉。
监控线负责采样,采样间隔要提前定好。太密会产生明显的额外开销,太疏会漏掉瞬时的降频或者功耗尖峰。一般整机级别的测试,1 秒一次的采样间隔是个不错的起点;观察瞬时行为时可以降到 0.2 秒,但要在报告里注明采样开销。
记录线负责落盘,把原始数据完整保存下来。这里有个细节:不要只存平均值。平均值会掩盖掉所有的抖动信息,而抖动恰恰是判断稳定性的关键。至少要存时间序列,能画成曲线的那种。
下面是一段典型的压测启动脚本框架,把三条线的隔离关系体现出来。工具名用通用的开源压测组件示意,实际替换成你手头的那一套即可:
# 1. 清理后台,确认环境 pkill -f 后台同步进程名 || true sync && echo 3 > /proc/sys/vm/drop_caches # 2. 启动监控,输出到独立文件,采样 1 秒 ( while true; do date +%s >> /tmp/monitor_time.log cat /proc/loadavg >> /tmp/monitor_load.log sensors >> /tmp/monitor_temp.log sleep 1 done ) & MONITOR_PID=$! # 3. 启动负载,全核整数与浮点混合,持续 900 秒 stress-ng --cpu 0 --cpu-method all --timeout 900s \ --metrics-brief > /tmp/load_cpu.log 2>&1 # 4. 收尾,停掉监控 kill $MONITOR_PID这段脚本的价值不在于命令本身,而在于它体现的隔离思路:监控是独立进程、独立文件,负载结束后监控立刻停,避免把收尾阶段的数据混进结果里。真正做项目时,我会把监控脚本写得更细,加入功耗读数、频率读数、节流计数,并且每一类指标落到一个独立文件,方便后面单独分析。
3. CPU 与内存:从峰值算力到持续输出
CPU 和内存是绝大多数任务的第一瓶颈,也是测试最容易做偏的地方。很多人只测峰值算力,跑个几秒钟看到分数很高就结束了,这在实际工作中参考价值很低。真正有意义的指标是"持续输出能力",也就是在温度平衡、功耗受限的状态下,机器还能维持多少性能。
3.1 CPU 负载模型的选取与持续时长设计
选负载模型之前,先想清楚你的真实任务长什么样。常见的模型有这么几类:
单线程高频型,比如老一些的办公软件、部分编译阶段、某些脚本解释器。这类任务只需要开 1 个线程,观察单核最高能跑到多少频率、能维持多久。测试时要注意操作系统可能把线程在核心之间来回调度,导致读数跳动,最好用绑定核心的方式固定住。
全核并行型,比如视频转码、批量计算、渲染。这类任务要求所有核心同时满载,是最容易撞到功耗墙和温度墙的场景。测试时线程数要设成物理核心数,然后分别测"开超线程"和"关超线程"两种情况,因为不同任务对超线程的收益差别很大。
混合指令型,全核满载但指令流里既有整数也有浮点,还有大量分支和内存访问。这是最接近真实应用的模型,也是最能暴露问题的模型。纯浮点重载的压测虽然能把温度拉得最高,但它对内存和缓存系统的压力反而不如混合型。
负载选定之后,时长设计有个经验值:先跑 15 分钟看温度是否进入平衡。大多数风冷或者一体式水冷方案,在满负载下 10 到 15 分钟温度曲线会基本走平,这时候的频率才是"持续频率"。如果 15 分钟还没走平,说明散热能力偏弱,或者环境温度太高,需要延长观察时间。
进入平衡之后,再继续跑 30 分钟,重点看三件事:
- 频率是否还在往下掉。持续下降说明温度还在缓慢爬升,或者功耗管理策略在逐步收紧。
- 节流计数是否在涨。这个计数直接反映硬件为了保护自己而降频的次数,只要在涨就说明碰到了限制。
- 性能数值的波动幅度。稳定状态下,每轮的成绩波动应该很小;如果忽高忽低,往往是后台有干扰,或者散热策略在频繁调整风扇转速。
我自己测过一台机器,前 12 分钟成绩非常漂亮,第 13 分钟开始断崖式下跌,最后稳定在峰值的六成左右。查下来是散热模组的接触有问题,短时测试完全看不出来,只有跑到温度平衡才会暴露。这也是我坚持长时测试的原因——短时数据只能证明"它能跑快",长时数据才能证明"它能一直跑快"。
3.2 内存带宽、延迟与容量压力的分测
内存这块经常被一句"多少 G 多大频率"带过,实际上至少要分三个维度测,而且三个维度的结论可能完全相反。
带宽是最直观的。理论值的算法是:单条位宽 64 位,也就是 8 字节,乘以等效频率,再乘以通道数。举个数:等效频率 5600 的双通道配置,理论带宽是 5600 × 8 × 2 = 89600 MB/s,约 89.6 GB/s。实测值一般在理论值的七到八成之间,低于六成就该怀疑通道没插对、频率没跑满,或者被其他部件抢了带宽。带宽测试要分别测读、写、拷贝三项,因为很多任务对读写的需求是不对称的。
延迟是第二个维度,对随机访问密集的任务影响巨大。延迟的单位是纳秒,数值越小越好。影响延迟的主要是频率和时序参数。这里有个反直觉的现象:某些高频率低时序的配置,延迟表现反而不如频率略低但时序更紧的配置。所以延迟必须实测,不能靠参数推算。
容量压力是第三个维度,也是最容易被忽略的。测法是:把内存占用逐步推高到接近物理容量上限,观察系统是否开始使用交换空间、性能是否出现台阶式下跌。这个台阶的位置非常关键——如果你的实际任务峰值内存占用刚好在这个台阶附近,那这台机器的配置就是不够的,跑分再高也没用。
| 测试维度 | 主要指标 | 关注点 | 典型问题表现 |
|---|---|---|---|
| 带宽 | 读、写、拷贝 GB/s | 实测与理论值的比例 | 低于六成,多因通道或频率未达标 |
| 延迟 | 纳秒 | 与同规格配置的横向对比 | 明显偏高,多因时序设置保守 |
| 容量压力 | 台阶出现时的占用率 | 台阶位置与实际任务峰值的关系 | 台阶过早,任务中途卡顿 |
测试时还有个细节要注意:内存带宽测试本身对 CPU 频率敏感,如果测试期间 CPU 因为温度问题降了频,带宽数据也会跟着偏低。所以带宽测试前要先确认 CPU 处于稳定状态,或者至少在测试期间同步记录频率,方便后面做归一化处理。
4. 存储与图形:被缓存和驱动遮住的真相
存储和图形这两块,是数据最容易骗人的地方。原因很相似:它们都有多层缓存,都有复杂的驱动调度,短时间的漂亮数据往往只是缓存层在起作用。
4.1 存储测试中队列深度与缓存的三重陷阱
存储测试的第一个陷阱是缓存。绝大多数存储设备都有一块高速缓存区,写入的数据先落进缓存,测出来的速度是缓存的速度,不是介质的速度。判断是否落到介质上,要看缓存耗尽之后的曲线拐点。测试方法很简单:连续写入的数据量要远远超过缓存容量,比如缓存是若干 GB,你就写它十倍以上的数据量,观察速度曲线在哪里掉下来。掉下来之后的那一段,才是真实写入速度。
第二个陷阱是队列深度。队列深度指的是同时有多少个读写请求在排队。队列深度为 1 时,测的是单请求延迟,这个数值反映系统的响应能力;队列深度拉高之后,测的是吞吐能力,反映系统的并发处理能力。这两个数值不能互相替代,也不能只看高的那个。很多日常任务其实更依赖低队列深度下的表现,因为它们的并发度并不高。
第三个陷阱是访问模式。顺序读写和随机读写的差距可以有几十倍。测试要覆盖四种基本组合:顺序读、顺序写、随机读、随机写,每种都要测不同的块大小。块大小从 4KB 到 1MB 甚至更大,因为不同大小的请求走的是完全不同的处理路径。
判定"进入稳态"有个常用的经验标准:连续测 5 轮,每轮的随机写性能波动幅度都小于 5%,就可以认为进入稳态了。达不到这个标准说明设备还在做内部整理,数据还不能代表长期表现。
# 顺序写,块大小 1M,队列深度 32,直接 IO 绕过系统缓存 fio --name=seq_write --rw=write --bs=1M --iodepth=32 \ --size=20G --direct=1 --runtime=300 --time_based \ --output-format=json > /tmp/seq_write.json # 随机写,块大小 4K,队列深度 1,测单请求响应 fio --name=rand_write_qd1 --rw=randwrite --bs=4k --iodepth=1 \ --size=20G --direct=1 --runtime=300 --time_based \ --output-format=json > /tmp/rand_write_qd1.json--direct=1这个参数是必须的,它让读写绕过操作系统的页缓存,直接打到设备上。少了它,你测的可能是内存的速度。--runtime配合--time_based保证每轮测试时长一致,方便横向比较。数据量--size要设得足够大,超缓存容量,否则测到一半就结束了。
还有一个非常实用的经验:测试前后的设备状态要一致。如果测试前设备刚经历过大量写入,内部还在做后台整理,测出来的数据会明显偏低。标准做法是测试前静置一段时间,或者先做一轮预热写入把状态"抹平",再开始正式测试。
4.2 图形性能:帧率之外还要看帧时间与功耗
图形性能测试最常见的错误是只看平均帧率。平均帧率会掩盖掉卡顿,两个平均帧率完全相同的配置,实际手感可能天差地别。原因是平均值把偶尔的长帧时间平摊掉了,而人眼对长帧非常敏感。
正确的做法是同时记录帧时间序列,然后计算分位数。常用的指标是 1% low,也就是把帧时间从长到短排序,取最长的 1% 那部分,看它们的平均帧时间是多少。这个数值直接对应"最卡的时候有多卡"。还有 0.1% low,对应的是极端的卡顿瞬间。这两个指标配合平均帧率看,才能完整描述体验。
第二个要注意的是分辨率和画质设定的组合。同一个显卡在不同分辨率下的瓶颈位置完全不同:低分辨率下瓶颈往往在 CPU 和驱动,高分辨率下瓶颈转移到图形处理器本身。所以测试必须覆盖你实际使用的分辨率和画质档位,拿别人的高分数据来对比没有意义。
第三个是功耗与温度。图形处理器在高负载下的功耗可以占到整机的一大半,它的温度表现直接影响整机散热设计的余量。测试时要同步记录包功耗、核心温度、显存温度、风扇转速。如果风扇转速已经拉满但温度还在爬升,说明散热余量不足,长时间高负载会降频。
最后是驱动版本。图形驱动的版本迭代对性能的影响经常比硬件差异还大,尤其是新发布的软件。测试报告里必须写明驱动版本,不同版本的横向对比没有任何意义。
5. 功耗与散热:整机行为的最终裁决者
前面测的所有单项性能,最终都要受功耗和散热的约束。这两个因素决定了机器能跑多快、能跑多久、能跑多稳。忽视这一层,前面所有数据都只是理论值。
5.1 功耗墙、温度墙与降频的观测链路
现代硬件的性能释放是由几个"墙"共同约束的。理解这些墙,才能看懂降频现象背后的原因。
功耗墙指的是硬件被允许消耗的最大功率。它通常分两档:一档是短时上限,允许在几十秒内超出一部分功率来提升响应速度;另一档是长时上限,是持续运行时的约束。测试时如果观察到包功耗长时间贴着长时上限,同时频率在往下走,那就是撞了功耗墙。
温度墙指的是硬件允许的最高温度。一旦核心温度触到这条线,硬件就会降频把温度压回去。这是自我保护机制,本身不是故障,但如果频繁触发,说明散热能力不够。
电流墙相对隐蔽一些,它限制的是瞬时电流。有些负载会瞬间拉出很高的电流,触发电流保护后频率会短暂下探,表现为性能数值的毛刺。
观测这三者的方法,是同时记录四个量:包功耗、核心温度、实际频率、节流计数。然后看它们的时间关系:
| 现象 | 功耗 | 温度 | 频率 | 节流计数 | 判断 |
|---|---|---|---|---|---|
| 撞功耗墙 | 贴近上限 | 未到上限 | 下降 | 可能上涨 | 供电或功耗策略限制 |
| 撞温度墙 | 未到上限 | 贴着上限 | 下降 | 持续上涨 | 散热能力不足 |
| 环境问题 | 低于上限 | 整体偏高 | 略低 | 偶发上涨 | 环境温度或风道问题 |
这张表的用法是:先把四个量画在同一张时间轴上,观察它们的先后关系。如果频率下降发生在温度触顶之前,那大概率是功耗墙;如果温度先触顶、频率后下降,那就是温度墙。这个先后关系非常关键,因为两者的处理方式完全不同。
注意:测功耗时要用独立的功率计测量墙插功耗,不要只看硬件内部上报的包功耗。内部上报的数值不含供电转换损耗,和实际耗电差得不少;而且有些平台的上报值本身就不太准。
5.2 长稳压测的设计:时长、循环、恢复
长稳压测是验收环节最有价值的一项。它要回答的问题是:这台机器在连续高负载下,性能会不会持续衰减,会不会出现异常。
时长设计上,我会分三档:
30 分钟档适合日常验收,能看到温度平衡和初步的降频趋势。这个时长足以暴露散热设计的问题,成本也不高。
2 小时档适合关键设备或者选型对比,能看到更长时间的热积累效应,以及功耗管理策略在长时间下的表现。
8 小时以上档只在特殊场景才做,比如需要 7×24 运行的设备。这一档主要是看有没有偶发的异常,比如某个部件在长时间运行后出现错误、系统出现不稳定。
长稳压测的负载设计有个技巧:不要用单一的满负载跑到底,而是用循环负载。真实的业务负载是波动的,会经历满载、半载、空载的交替。循环负载能暴露单一负载看不到的问题,比如风扇转速频繁变化带来的噪声、功耗状态频繁切换带来的效率损失、缓存反复填充和冲刷带来的性能波动。我的做法是设计一个 10 分钟左右的循环:3 分钟全核满载、3 分钟半载、2 分钟空载、2 分钟混合负载,重复若干轮。
循环负载跑完之后,一定要做恢复测试:让机器空载静置 10 分钟,看各项指标能不能回落到开测前的空载基线。回落到接近基线,说明散热和功耗管理正常;回落不了,或者回落速度明显变慢,说明散热系统有积热问题,或者内部风道设计不合理。这个测试花不了多少时间,但能发现很多隐藏问题。
还有一个细节:噪声。长稳压测期间,用分贝计在固定距离测量噪声,记录满载和空载的差值。很多设备在短时测试时风扇转速不高,噪声表现良好,但长时间满载后风扇拉满,噪声会变得难以接受。这个数据对办公场景的设备选型尤其重要,而它恰恰是跑分软件永远不会告诉你的。
6. 数据可疑时的排查链路与报告交付
测试做得再规范,也会遇到数据看起来不对劲的时候。这时候最忌讳的是直接下结论说"这台机器有问题"或者"这个工具不准",而应该按顺序排查,把可能性一个个排除掉。
6.1 数据漂移的五步排查顺序
第一步,查环境。先确认测试期间的环境有没有变化:环境温度、机器摆放、进出风口有没有被挡、有没有人碰过机器。这一步最容易被跳过,但它解释掉的异常比例最高。我遇到过好几次"性能突然下降",最后查出来是空调出风口被挪了位置,环境温度高了好几度。
第二步,查后台。确认测试期间没有其他进程在跑。这一项不能靠"我记得关掉了",要实际去看进程列表和系统负载。有时候是自动更新、有时候是同步工具、有时候是某个服务重启了。有个实用技巧:在测试前后各跑一次进程快照,对比差异。
第三步,查状态残留。确认机器在测试前处于什么状态。如果上一轮测试刚结束、机器还是热的,这一轮开始时的温度起点就不一样,数据自然不可比。标准做法是每轮测试之间留出足够的冷却间隔,或者至少记录每轮的起始温度,方便后面归一化。
第四步,查配置漂移。确认固件、驱动、系统设置有没有被自动更新改掉。这一项在长期项目中特别常见,隔了几周再测,某个驱动悄悄升级了,数据当然对不上。
第五步,查工具链。确认压测工具和监控工具本身的版本、参数有没有变化。有时候是脚本里某个参数被改了,有时候是工具升级后默认值变了。
这五步的顺序不能乱,因为它们是按"最可能且最容易排查"到"最不可能且最难排查"排列的。百分之八十的异常在第一步和第二步就能定位,没必要一上来就怀疑硬件故障。
如果真的五步都排除了,才需要进入硬件层面的排查:交叉替换部件、单独测试每个部件、检查连接是否牢固、检查是否有降级运行的情况。这一步成本高,所以要放在最后。
6.2 一份能被别人复现的报告该写什么
测试报告的价值不在于结论多漂亮,而在于别人拿着你的报告能不能复现出同样的结果。一份合格的报告至少要包含这些内容:
硬件配置清单,精确到型号、容量、数量、插槽位置。内存的插槽位置要写清楚,因为这是验收时最容易出问题的地方。
固件与驱动版本,逐项列出。这一项决定了数据能不能和别的项目横向对比。
环境条件,环境温度、供电情况、机器的摆放方式。有条件的话,电源也要记录,因为供电不稳会直接反映在性能数据上。
测试方法与参数,包括使用的工具、版本、完整的命令行参数、单轮时长、重复次数。参数必须完整,少一个默认值就可能让结果差很多。
原始数据,不要只给平均值。时间序列、分位数、波动范围都要保留。原始数据最好以结构化格式存档,方便后面重新分析。
结论与判断依据,每一条结论都要能对应到具体数据。比如"该机器在长时满载下性能衰减约两成",后面要跟上具体的峰值数值、稳态数值和观测时长。
异常记录,测试过程中出现的任何异常都要记录,包括当时的现象、排查过程、最终结论。这部分往往是最有价值的内容,因为它是别人踩坑时的参考。
我个人的习惯是,报告里专门留一节写"本次测试中不确定的部分"。比如某个数据波动较大没法下结论、某个指标受限于工具精度测不准、某个场景没有覆盖到。把不确定性写明白,比强行给出一个确定的结论要靠谱得多,也让读报告的人知道哪些地方需要自己再验证一遍。
最后分享一个我在实操中形成的小习惯:每完成一轮测试,就在当天的记录里写下"这一轮我注意到了什么、下一轮想验证什么"。这份随手记比正式报告更能反映出测试过程中的思考轨迹,隔一段时间回头看,经常能发现自己当时忽略掉的线索。硬件性能测试最怕的就是机械地跑数据,把这些观察记下来,测试才真正变成对系统行为的理解。