回归测试用于测试系统的特定部分,以确保其按预期工作,并确保旧漏洞不会再次引入。
FreeBSD 回归测试工具可以在 FreeBSD 源码树中的目录 src/tools/regression 找到。
本节包含在 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 操作中移除对磁盘的访问时间更新等影响。
在每次运行之前使用 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)卸载磁盘。
除非正在测试网络,否则不要配置网络,或者在测试完成后将结果发送到另一台计算机。
禁用“涡轮增压模式”,因为它们使时钟频率明确依赖于环境。这意味着在完全相同的代码上运行基准测试可能取决于一天中的时间、咖啡与苏打水的对比,甚至办公室里有多少其他人。
如果系统必须连接到公共网络,请注意广播流量的突发增加。即使几乎察觉不到,它也会占用 CPU 周期。多播有类似的注意事项。* 将每个文件系统放在自己的磁盘上。这样可以最大程度地减少由于磁头寻道优化而产生的抖动。* 尽量减少输出到串行或 VGA 控制台。将输出运行到文件中可以减少抖动。(串行控制台很容易成为瓶颈。)在测试运行时不要触摸键盘,即使是空格键或退格键也会在数字中显示出来。* 确保测试时间足够长,但不要太长。如果测试时间太短,时间戳会成为问题。如果时间太长,温度变化和漂移将影响计算机中石英晶体的频率。经验法则:超过一分钟,少于一小时。* 尽量保持机器周围的温度尽可能稳定。这会影响石英晶体和磁盘驱动器算法。要获得真正稳定的时钟,请考虑稳定的时钟注入。例如,获取 OCXO + PLL,将输出注入时钟电路而不是主板晶体。有关更多信息,请联系 Poul-Henning Kamp phk@FreeBSD.org。* 至少运行测试 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 ,因为 rc(8) 会唤醒并检查是否需要在启用后台 fsck 时在任何文件系统上运行 fsck 。同样,确保没有闲置的快照,除非基准测试是带有快照的测试。* 如果基准测试显示意外的糟糕性能,请检查诸如来自意想不到的来源的高中断量之类的问题。有报道称某些版本的 ACPI 会“表现不端”并生成过多的中断。为帮助诊断奇怪的测试结果,拍摄一些 vmstat -i 的快照并寻找任何异常情况。* 一定要小心内核和用户空间的优化参数,以及调试。很容易让一些东西溜走,后来才意识到测试并非在比较相同的事物。* 除非测试感兴趣对这些功能进行基准测试,否则绝不能启用 WITNESS 和 INVARIANTS 内核选项进行基准测试。 WITNESS 可导致性能下降 400%+。同样,在 -CURRENT 中,默认的用户空间 malloc(3) 参数与它们在生产版本中的提供方式不同。
源代码搭配盒包括:
一个构建脚本,燃点盒子(tinderbox),用于自动检出特定版本的 FreeBSD 源代码树并构建它。
一个监督脚本,tbmaster,用于监视各个 Tinderbox 实例,记录它们的输出,并发送失败通知邮件。
一个名为 index.cgi 的 CGI 脚本,读取一组 tbmaster 日志,并呈现这些日志的易读 HTML 摘要。
一组构建服务器,不断测试最重要的 FreeBSD 代码分支的最新版本。
一个 Web 服务器,保留完整的 Tinderbox 日志并显示最新摘要。
这些脚本由 Dag-Erling Smørgrav des@FreeBSD.org维护和开发,现在使用 Perl 编写,而不是原始版本中的shell脚本。所有脚本和配置文件都保存在/projects/tinderbox/中。
对于在这个阶段有关火柴盒和 tbmaster 脚本更多信息,请参阅它们各自的手册页:tinderbox(1)和 tbmaster(1)。
index.cgi 脚本生成火柴盒和 tbmaster 日志的 HTML 摘要。尽管最初设计用作 CGI 脚本,如其名称所示,但该脚本也可以从命令行或 cron(8)作业中运行,在这种情况下,它将查找位于脚本所在目录的日志。当作为 CGI 脚本运行时,它将自动检测上下文,生成 HTTP 头。它符合 XHTML 标准,并使用 CSS 进行样式设置。
脚本在 main() 块开始运行,通过尝试验证它是否正在官方 Tinderbox 网站上运行。如果不是,则生成一个页面,指示这不是官方网站,并提供官方网站的网址。
接下来,它扫描日志目录以获取配置、分支和体系结构的清单,以避免在脚本中硬编码列表,并可能导致空白行或列。这些信息是从日志文件的名称匹配以下模式中获得的:
在官方 Tinderbox 构建服务器上使用的配置是根据它们构建的分支命名的。例如, releng_8 配置用于构建 RELENG_8 以及所有仍受支持的发布分支。
一旦所有这些启动程序都成功完成,每个配置都调用 do_config() 。
do_config() 函数为单个 Tinderbox 配置生成 HTML。
它首先生成一个标题行,然后迭代使用指定配置构建的每个分支构建,以以下方式为每个生成一个结果行:
对于每个项目:
对于该体系结构中的每台机器:
如果存在简要日志文件,则:
调用 success() 以确定构建的结果。
输出修改的大小。
输出简要日志文件的大小,并附上日志文件的链接。
如果存在完整的日志文件,则:
输出完整日志文件的大小,并附带日志文件的链接。
否则:
没有输出。
上述 success() 函数扫描一个简短的日志文件,以查找字符串“tinderbox run completed”,以确定构建是否成功。
配置和分支根据它们的分支等级进行排序。计算方法如下:
HEAD 和 CURRENT 的等级为 9999。
RELENG_x 的等级为 xx 99。
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 定义。成功构建显示为绿色文本;不成功的构建显示为红色文本。随着时间的推移,颜色会逐渐变为灰色,每半小时颜色会更接近灰色。
官方 Tinderbox 构建服务器由 Sentex Data Communications 托管,他们也托管 FreeBSD Netperf 集群。
目前存在三台构建服务器:
freebsd-current.sentex.ca 构建:
HEAD 适用于 amd64、arm、i386、i386/pc98、ia64、mips、powerpc、powerpc64 和 sparc64。
RELENG_9 和支持的 9.X 分支,适用于 amd64、arm、i386、i386/pc98、ia64、mips、powerpc、powerpc64 和 sparc64。
freebsd-stable.sentex.ca 构建:
RELENG_8 和支持的 8.X 分支,适用于 amd64、i386、i386/pc98、ia64、mips、powerpc 和 sparc64。
免费加拿大(sentex.ca)的构建:
RELENG_7 和支持的 7.X 分支,适用于 amd64、i386、i386/pc98、ia64、powerpc 和 sparc64。
定制官方构建服务器的摘要和日志可在线查看,网址为 http://tinderbox.FreeBSD.org,由 Dag-Erling Smørgrav < des@FreeBSD.org> 托管并设置如下:
一个 cron(8) 作业定期检查构建服务器,并使用 rsync(1) 下载任何新的日志文件。
Apache 被设置为使用 index.cgi 作为 DirectoryIndex 。