第 6 章 回归测试和性能测试

回归测试用于测试系统的特定部分,以检查其是否按预期工作,并确保不会重新引入旧错误。

FreeBSD 回归测试工具可以在 FreeBSD 源代码树的 src/tools/regression 目录中找到。

6.1. 微基准测试清单

本节包含在 FreeBSD 上或 FreeBSD 本身进行适当微基准测试的提示。

不可能每次都使用以下所有建议,但使用得越多,基准测试测试细微差异的能力就越好。

  • 禁用 APM 和任何其他类型的时钟调整 (ACPI?)。

  • 在单用户模式下运行。例如,cron(8) 和其他守护进程只会增加噪音。 sshd(8) 守护进程也可能导致问题。如果在测试期间需要 ssh 访问,请禁用 SSHv1 密钥重新生成,或在测试期间终止父 sshd 守护进程。

  • 不要运行 ntpd(8)

  • 如果生成了 syslog(3) 事件,请使用空的 /etc/syslogd.conf 运行 syslogd(8),否则,不要运行它。

  • 最大限度地减少磁盘 I/O,如果可能,完全避免它。

  • 不要挂载不需要的文件系统。

  • 如果可能,以只读方式挂载 //usr 和任何其他文件系统。这将从 I/O 图像中删除对磁盘 (等) 的 atime 更新。

  • 使用 newfs(8) 重新初始化读/写测试文件系统,并在每次运行之前从 tar(1)dump(8) 文件中填充它。在开始测试之前卸载并挂载它。这将导致一致的文件系统布局。对于 worldstone 测试,这将应用于 /usr/obj(只需使用 newfs 重新初始化并挂载)。为了获得 100% 的可重复性,请从 dd(1) 文件中填充文件系统(即:dd if=myimage of=/dev/ad0s1h bs=1m

  • 使用 malloc 支持或预加载的 md(4) 分区。

  • 在测试的各个迭代之间重新启动,这将提供更一致的状态。

  • 从内核中删除所有非必要的设备驱动程序。例如,如果测试不需要 USB,请不要将 USB 放入内核。经常连接的驱动程序通常有超时计时。

  • 取消配置未使用的硬件。如果磁盘不用于测试,请使用 atacontrol(8)camcontrol(8) 分离磁盘。

  • 除非正在测试网络,否则不要配置网络,或者等到测试完成后再将结果发送到另一台计算机。

  • 禁用“Turbo 模式”,因为它们使时钟频率明确地依赖于环境。这意味着在 100% 相同的代码上运行的基准测试可能会依赖于一天中的时间、咖啡与苏打水,甚至办公室里有多少其他人。

如果系统必须连接到公共网络,请注意广播流量的峰值。即使它几乎没有引起注意,它也会占用 CPU 周期。多播也有类似的注意事项。* 将每个文件系统放在自己的磁盘上。这最大限度地减少了来自寻道优化的抖动。* 最小化对串行或 VGA 控制台的输出。将输出运行到文件中可以减少抖动。(串行控制台很容易成为瓶颈。)在测试运行期间不要触摸键盘,即使是 空格退格 也会显示在数字中。* 确保测试足够长,但不要太长。如果测试太短,则时间戳是一个问题。如果时间太长,温度变化和漂移会影响计算机中石英晶体的频率。经验法则:超过一分钟,少于一小时。* 尽量使机器周围的温度保持稳定。这会影响石英晶体和磁盘驱动器算法。为了获得真正稳定的时钟,请考虑稳定的时钟注入。例如,获取 OCXO + PLL,将输出注入时钟电路而不是主板晶体。有关此方面的更多信息,请联系 Poul-Henning Kamp <[email protected]>。* 至少运行测试 3 次,但最好运行超过 20 次,用于“之前”和“之后”的代码。如果可能,尝试交错(即:不要先运行 20 次,然后再运行 20 次),这使得能够发现环境影响。不要以 1:1 的比例交错,而是以 3:3 的比例交错,这使得能够发现交互作用。

+ 一个好的模式是:bababa{bbbaaa}*。这在第一次 1+1 次运行后给出提示(因此,如果测试完全走错了方向,可以停止测试),在第一次 3+3 次运行后给出标准偏差(如果值得长时间运行,则可以很好地指示),以及以后的趋势和交互数字。* 使用 ministat(1) 来查看数字是否显着。如果您忘记或从未学习过标准差和学生 t 分布,请考虑购买“卡通统计指南”ISBN:0062731025,强烈推荐。* 除非测试是后台 fsck 的基准测试,否则不要使用后台 fsck(8)。此外,除非基准测试在启动至少 60+“fsck 运行时间”秒后才启动,否则在 /etc/rc.conf 中禁用 background_fsck,因为当启用后台 fsck 时,rc(8) 会唤醒并检查任何文件系统上是否需要运行 fsck。同样,请确保周围没有快照,除非基准测试是带有快照的测试。* 如果基准测试显示意外的性能下降,请检查来自意外来源的高中断量等问题。据报告,某些版本的 ACPI 会“行为异常”并生成过多的中断。为了帮助诊断奇怪的测试结果,请拍摄 vmstat -i 的几个快照并查找任何异常情况。* 确保小心处理内核和用户空间的优化参数,以及调试。很容易让某些东西溜过去,然后后来才意识到测试没有比较相同的东西。* 除非测试对基准测试这些功能感兴趣,否则永远不要在启用 WITNESSINVARIANTS 内核选项的情况下进行基准测试。WITNESS 会导致性能下降 400%+。同样,用户空间 malloc(3) 参数在 -CURRENT 中的默认值与它们在生产版本中的默认值不同。

6.2. FreeBSD 源代码 Tinderbox

源代码 Tinderbox 包括

  • 一个构建脚本 tinderbox,它自动化了检出 FreeBSD 源代码树的特定版本并构建它的过程。

  • 一个监督脚本 tbmaster,它监视各个 Tinderbox 实例,记录其输出并发送故障通知电子邮件。

  • 一个名为 index.cgi 的 CGI 脚本,它读取一组 tbmaster 日志并显示其易于阅读的 HTML 摘要。

  • 一组构建服务器,它们持续测试最重要的 FreeBSD 代码分支的最新版本。

  • 一个Web服务器,它保留了完整的Tinderbox日志并显示最新的摘要。

这些脚本由Dag-Erling Smørgrav <[email protected]>维护和开发,现在使用Perl编写,从最初的shell脚本版本迁移而来。所有脚本和配置文件都保存在/projects/tinderbox/中。

有关此阶段tinderbox和tbmaster脚本的更多信息,请参阅它们各自的手册页:tinderbox(1)和tbmaster(1)。

6.3. index.cgi脚本

index.cgi脚本生成Tinderbox和tbmaster日志的HTML摘要。虽然最初设计为CGI脚本(如其名称所示),但此脚本也可以从命令行或cron(8)作业中运行,在这种情况下,它将在脚本所在的目录中查找日志。它将自动检测上下文,在作为CGI脚本运行时生成HTTP标头。它符合XHTML标准并使用CSS进行样式设置。

脚本在main()块中启动,首先尝试验证它是否在官方Tinderbox网站上运行。如果不是,则会生成一个页面,指示它不是官方网站,并提供官方网站的URL。

接下来,它扫描日志目录以获取配置、分支和体系结构的清单,这些配置、分支和体系结构存在日志文件,以避免将列表硬编码到脚本中并可能最终出现空白行或列。此信息源自与以下模式匹配的日志文件名

tinderbox-$config-$branch-$arch-$machine.{brief,full}

官方Tinderbox构建服务器上使用的配置以它们构建的分支命名。例如,releng_8配置用于构建RELENG_8以及所有仍在支持的发布分支。

一旦所有这些启动过程成功完成,就会为每个配置调用do_config()

do_config()函数为单个Tinderbox配置生成HTML。

它的工作原理是首先生成一个标题行,然后迭代具有指定配置的每个分支构建,以以下方式为每个构建生成一行结果

  • 对于每个项目

    • 对于该体系结构中的每个机器

      • 如果存在简短的日志文件,则

        • 调用success()以确定构建的结果。

        • 输出修改大小。

        • 输出简短日志文件的大小,并提供指向日志文件本身的链接。

        • 如果也存在完整日志文件,则

          • 输出完整日志文件的大小,并提供指向日志文件本身的链接。

      • 否则

        • 无输出。

上面提到的success()函数扫描简短日志文件中的字符串“tinderbox run completed”以确定构建是否成功。

配置和分支根据其分支等级排序。计算方法如下

  • HEADCURRENT的等级为9999。

  • RELENG_x的等级为xx99。

  • RELENG_x_y的等级为xxyy

这意味着HEAD始终排名最高,RELENG分支按数字顺序排序,每个STABLE分支的排名都高于从中派生的发布分支。例如,对于FreeBSD 8,从最高到最低的顺序为

  • RELENG_8(分支等级899)。

  • RELENG_8_3(分支等级803)。

  • RELENG_8_2(分支等级802)。

  • RELENG_8_1(分支等级801)。

  • RELENG_8_0(分支等级800)。

Tinderbox用于表格中每个单元格的颜色由CSS定义。成功的构建以绿色文本显示;不成功的构建以红色文本显示。颜色随着自相应构建以来时间的推移而逐渐淡化,每半小时颜色都更接近灰色。

6.4. 官方构建服务器

官方Tinderbox构建服务器由Sentex Data Communications托管,该公司还托管FreeBSD Netperf集群。

目前存在三个构建服务器

freebsd-current.sentex.ca构建

  • amd64、arm、i386、i386/pc98、ia64、mips、powerpc、powerpc64和sparc64的HEAD

  • amd64、arm、i386、i386/pc98、ia64、mips、powerpc、powerpc64和sparc64的RELENG_9和受支持的9.X分支。

freebsd-stable.sentex.ca构建

  • amd64、i386、i386/pc98、ia64、mips、powerpc和sparc64的RELENG_8和受支持的8.X分支。

freebsd-legacy.sentex.ca构建

  • amd64、i386、i386/pc98、ia64、powerpc和sparc64的RELENG_7和受支持的7.X分支。

6.5. 官方摘要网站

来自官方构建服务器的摘要和日志可在http://tinderbox.FreeBSD.org在线获取,由Dag-Erling Smørgrav <[email protected]>托管并按如下方式设置

  • 一个cron(8)作业定期检查构建服务器并使用rsync(1)下载任何新的日志文件。

  • Apache被设置为使用index.cgi作为DirectoryIndex


最后修改时间:2024年5月29日,由Benedict Reuschling修改