4. 基准测试方法论与实验设计

在 Layerscape 平台上做性能基准,最容易犯的错误不是“不会跑工具”,而是“跑出来的数据不可信”。同一块 LS1046A,同一份 iperf3 命令,上午测出 9.2 Gbps,下午测出 7.8 Gbps,如果直接拿这两个数字去对比优化前后的效果,结论必然是错的。基准测试方法论要解决的核心问题只有一个:让观测到的差异来自被测变量,而不是来自环境噪声、测量方式或统计偶然。

控制变量:先固定,再变化

Layerscape 的性能受大量因素共同影响:CPU 频率与调频策略、DDR 速率、SerDes 通道配置、PCIe 链路宽度与速率、内核版本与配置、中断亲和性、缓存与内存布局、对端设备能力、甚至机箱风道导致的温度差异。控制变量的原则是:一次实验只允许一个自变量变化,其余全部锁定并记录。

以评估“DPDK 转发是否比内核协议栈更快”为例,自变量是转发路径,那么以下量必须固定:CPU 定频(关闭 ondemand,用 cpufreq-set -g performance 或内核启动参数 cpufreq=performance)、关闭 C-state 深度睡眠、绑定相同的 CPU 核、使用相同的网卡队列数与描述符数量、相同的包长与包速率、相同的对端打流工具与版本。任何一项漂移,都可能产生与转发路径无关的差异。

建议为每次实验建立一份“环境指纹”:内核版本、设备树、固件版本、CPU 频率、DDR 频率、SerDes 模式、网卡固件、对端设备型号与固件、室温。没有环境指纹的数据,三个月后无法复现,也无法解释。

预热:让系统进入稳态

Layerscape 启动后,CPU 频率、DDR 训练、缓存填充、网卡描述符环、连接跟踪表、路由表、邻居表都处于“冷”状态。直接开始采样,前若干秒的数据会显著偏低。预热的目的就是让这些状态进入稳态。

预热时长没有统一答案,取决于被测对象。对于内存带宽测试(如 lmbench 的 bw_mem 或 stream),通常预热 1~2 轮即可;对于网络转发,建议先以目标速率的 50% 跑 30 秒,再以 100% 跑 30 秒,然后才开始正式采样;对于存储或文件系统,预热需要把工作集真正读入页缓存或触发设备内部 GC,可能需要数分钟。判断是否进入稳态的实用方法是:连续观察两个等长窗口的均值,若差异小于预设阈值(例如 2%),认为已稳态。

采样与统计显著性

单次测量没有统计意义。正确做法是:在稳态区间内进行多次独立重复,每次重复得到一个样本,用样本分布而不是单个数字下结论。对于吞吐类指标,建议至少 10 次重复;对于延迟类指标,建议至少 1000 次采样,因为延迟分布通常长尾。

比较两组数据时,不能只看均值差。例如 A 组均值 9.10 Gbps,B 组均值 9.05 Gbps,差 0.05 Gbps,但若两组标准差都是 0.15 Gbps,这个差异完全可能来自噪声。此时应做显著性检验:对吞吐可用 Welch t 检验,对延迟可用 Mann-Whitney U 检验(不假设正态)。判断标准是 p 值小于 0.05,同时结合效应量——统计显著不等于工程显著,0.05 Gbps 的差异在 10 Gbps 链路上没有实际意义。

置信区间:给出不确定度

只报“均值 9.10 Gbps”是不完整的,应报“均值 9.10 Gbps,95% 置信区间 [9.02, 9.18]”。置信区间告诉读者:如果重复实验,均值有 95% 的概率落在这个范围内。对于小样本(n<30),用 t 分布计算;对于大样本,可用正态近似。置信区间宽度直接反映测量精度:区间越窄,说明实验控制得越好,越容易分辨小差异。

异常值处理:先查原因,再决定去留

异常值不能随手删除。正确顺序是:先定位原因,再决定处理方式。常见原因包括:对端设备瞬时丢包、后台任务抢占 CPU、温度触发降频、网卡固件复位、交换机端口协商抖动。如果原因是可解释且与被测变量无关的偶发事件,可以剔除并记录;如果原因是系统性的(例如每次第 3 次重复都偏低),那它不是异常值,而是发现了新的影响因素,应作为实验结论的一部分。

统计上可用 IQR 法则识别候选异常值:计算四分位距 IQR = Q3 − Q1,落在 [Q1 − 1.5×IQR, Q3 + 1.5×IQR] 之外的点标记为候选。但标记不等于删除,必须结合日志和现场记录判断。

测试矩阵设计

当自变量不止一个时,需要设计测试矩阵。以 Layerscape 网络性能评估为例,自变量可能包括包长(64/512/1518 字节)、队列数(1/2/4/8)、转发路径(内核/DPDK)。若做全因子组合,共 3×4×2 = 24 组,每组 10 次重复,共 240 次运行。若资源有限,可先做单因子扫描确定敏感区间,再在敏感区间做全因子。矩阵设计的关键是:每个组合都要有独立的重复,且组合之间的环境指纹一致。

Layerscape 基准测试实验设计流程 ① 控制变量 CPU 定频 / 关 C-state 固定队列数 / 包长 锁定对端与固件版本 记录环境指纹 ② 预热至稳态 50% 速率 30s 100% 速率 30s 连续两窗口差 < 2% 判定进入稳态 ③ 重复采样 吞吐 ≥ 10 次重复 延迟 ≥ 1000 次采样 每次独立、互不干扰 得到样本分布 ④ 统计推断 均值 + 95% 置信区间 Welch t / Mann-Whitney p < 0.05 且效应量显著 给出不确定度 异常值处理:先定位原因,再决定去留 IQR 法则标记候选:落在 [Q1−1.5×IQR, Q3+1.5×IQR] 之外 可解释偶发 → 剔除并记录;系统性偏低 → 作为新影响因素保留 禁止无理由删除数据点 测试矩阵示例:包长 × 队列数 × 转发路径(3×4×2 = 24 组,每组 10 次重复) 包长 (B) 队列数 转发路径 重复次数 输出指标 64 / 512 / 1518 1 / 2 / 4 / 8 内核 / DPDK 10 吞吐均值 + 95% CI、P99 延迟 64 8 DPDK 10 9.10 Gbps [9.02, 9.18] 注:表中数值为示例假设数据,用于说明输出格式,非实测结果

一个可复用的实验记录模板

为了让上述原则落地,建议每次实验填写如下记录。字段不求多,但必须覆盖“环境指纹、自变量、重复次数、统计结果、异常值处理”五类信息。

实验编号: LS1046A-NET-2024-011
环境指纹:
  内核: 5.15.71-rt / 设备树: fsl-ls1046a-rdb
  CPU: 4×A72 @ 1.6GHz, governor=performance, C-state 关闭
  DDR: 2100 MT/s / SerDes: 10G-KR ×2
  对端: 同型号 LS1046A, 固件 v2.3
自变量: 转发路径 = {内核协议栈, DPDK}
控制量: 包长=64B, 队列数=8, 描述符=2048, 打流=TRex 100%
预热: 50% 30s + 100% 30s, 稳态判据 两窗口差 < 2%
采样: 每组 10 次重复, 每次 60s
结果:
  内核: 均值 6.42 Gbps, 95% CI [6.31, 6.53]
  DPDK: 均值 9.10 Gbps, 95% CI [9.02, 9.18]
  检验: Welch t, p = 0.0003, 效应量 Cohen's d = 4.7
异常值: 第 4 次内核重复 5.10 Gbps, 日志显示对端丢包, 剔除并记录
结论: DPDK 路径在 64B/8 队列下显著优于内核路径, 差异 2.68 Gbps
不要把“跑通一次”当作“完成基准”。没有重复、没有置信区间、没有环境指纹的数据,只能作为现象观察,不能作为工程结论。若必须用单次数据,应在报告中明确标注“单次观测,未做统计推断”。

最后强调一个容易被忽视的原则:基准测试的目标不是得到“最好看”的数字,而是得到“可复现、可解释、可比较”的数字。当别人拿着你的实验记录,在另一块同型号板卡上按同样步骤能复现出落在置信区间内的结果,这次基准测试才算真正完成。