一些显而易见的建议
在花费任何时间进行基准测试之前,必须在“综合”基准测试和“应用”基准测试之间做出基本选择。
综合基准测试专门用于衡量计算机系统各个组件的性能,通常是通过使其选定的组件达到最大容量来完成的。一个著名的综合基准测试示例是 Whetstone 套件,最初由 Harold Curnow 于 1972 年用 FORTRAN(或者那是 ALGOL?)编程,至今仍被广泛使用。Whetstone 套件将测量 CPU 的浮点性能。
可以对综合基准测试提出的主要批评是,它们不能代表计算机系统在实际情况下的性能。以 Whetstone 套件为例:主循环非常短,很容易放入 CPU 的一级缓存中,从而保持 FPU 流水线持续满载,并因此使其 FPU 以最大速度运行。如果我们记住 Whetstone 套件是在 25 年前编程的(其设计甚至早于此!),我们不能真正批评它,但是当涉及到对现代微处理器进行基准测试时,我们必须确保谨慎地解读其结果。
关于综合基准测试,另一个非常重要的注意事项是,理想情况下,它们应该告诉我们关于被测系统的特定方面的信息,而与其他所有方面无关:以太网卡 I/O 吞吐量的综合基准测试应该产生相同或相似的数字,无论它是在具有 4 MB RAM 的 386SX-16 上运行,还是在具有 64 MB RAM 的 Pentium 200 MMX 上运行。否则,测试将衡量 CPU/主板/总线/以太网卡/内存子系统/DMA 组合的整体性能:不是很有效,因为 CPU 的变化将比以太网网卡的变化产生更大的影响(这当然假设我们正在使用相同的内核/驱动程序组合,这甚至可能导致更大的变化)!
最后,一个非常常见的错误是平均各种综合基准测试,并声称这样的平均值是任何给定系统在实际性能方面的良好代表。
以下是对 FPU 基准测试的评论,经 Cyrix 公司网站许可引用
“浮点单元 (FPU) 加速旨在使用浮点数学的软件:通常是 CAD 程序、电子表格、3D 游戏和设计应用程序。然而,当今最流行的 PC 应用程序同时使用浮点和整数指令。因此,Cyrix 选择在 6x86 处理器的设计中强调“并行性”,以加速混合使用这两种指令类型的软件。
x86 浮点异常模型允许在浮点指令执行时发出并完成整数指令。相比之下,当之前的浮点指令正在执行时,第二个浮点指令无法开始执行。为了消除浮点异常模型造成的性能限制,6x86 可以推测性地向片上 FPU 发出最多四个浮点指令,同时继续发出和执行整数指令。例如,在两个浮点指令 (FLT) 后跟六个整数指令 (INT) 再后跟两个 FLT 的代码序列中,6x86 处理器可以在第一个 FLT 完成之前将所有十个指令发出到适当的执行单元。如果所有指令都没有错误(典型情况),则执行继续,整数和浮点单元并行完成指令。如果其中一个 FLT 发生错误(非典型情况),则 6x86 的推测性执行能力允许以与 x86 浮点异常模型兼容的方式恢复处理器状态。
对基准测试的检查表明,综合浮点基准测试使用纯浮点代码流,这在实际应用中找不到。这种类型的基准测试没有利用 6x86 处理器的推测性执行能力。Cyrix 认为,基于实际应用的非综合基准测试能更好地反映用户将获得的实际性能。实际应用程序包含混合的整数和浮点指令,因此受益于 6x86 推测性执行能力。”
因此,基准测试的最新趋势是选择常用应用程序并使用它们来测试完整计算机系统的性能。例如,SPEC,这个非营利性公司设计了著名的 SPECINT 和 SPECFP 综合基准测试套件,已经启动了一个新的应用程序基准测试套件项目。但是,同样,这些商业基准测试不太可能包含任何 Linux 代码。
总结一下,只要您了解综合基准测试的目的和局限性,它们就是有效的。应用基准测试将更好地反映计算机系统的性能,但 Linux 上没有任何可用的应用基准测试。
低级基准测试将直接测量硬件的性能:CPU 时钟、DRAM 和缓存 SRAM 周期时间、硬盘平均访问时间、延迟、磁道到磁道的步进时间等... 如果您购买了一个系统并想知道它是由哪些组件构建的,这可能会很有用,但是检查这些数据的更好方法是打开机箱,列出您可以找到的任何零件编号,并以某种方式获取每个零件的数据表(通常在 Web 上)。
低级基准测试的另一个用途是检查内核驱动程序是否为特定的硬件正确配置:如果您有组件的数据表,则可以将低级基准测试的结果与理论上的印刷规格进行比较。
高级基准测试更关注硬件/驱动程序/操作系统组合在微型计算机系统的特定方面(例如文件 I/O 性能)或甚至在特定的硬件/驱动程序/操作系统/应用程序性能(例如不同微型计算机系统上的 Apache 基准测试)方面的性能。
当然,所有低级基准测试都是综合性的。高级基准测试可能是综合基准测试或应用基准测试。
恕我直言,任何人在升级其 Linux 计算机中的任何组件时都可以进行的一个简单测试是在硬件/软件升级之前和之后启动内核编译,并比较编译时间。如果所有其他条件保持不变,那么该测试可以有效地衡量编译性能,并且可以自信地说
“将 A 更改为 B 导致 Linux 内核在如此这般的条件下编译时间提高了 x %”。
仅此而已!
由于内核编译是 Linux 下非常常见的任务,并且由于它执行了大多数正常基准测试会执行的功能(浮点性能除外),因此它构成了一个相当好的个体测试。但是,在大多数情况下,其他 Linux 用户无法重现此类测试的结果,因为硬件/软件配置存在差异,因此这种测试不能用作比较不同系统的“衡量标准”(除非我们都同意编译标准内核 - 见下文)。
不幸的是,除了 Byte Linux Benchmarks 之外,没有特定于 Linux 的基准测试工具,Byte Linux Benchmarks 是 Byte Unix Benchmarks 的略微修改版本,其历史可以追溯到 1991 年 5 月(Linux 修改者为 Jon Tombs,原始作者为 Ben Smith、Rick Grehan 和 Tom Yager)。
Byte Linux Benchmarks 有一个中央 网站。
David C. Niemi 整理了一个改进的、更新版本的 Byte Unix Benchmarks。它被称为 UnixBench 4.01,以避免与早期版本混淆。以下是 David 对他的修改的描述
“原始的和略微修改的 BYTE Unix 基准测试在很多方面都存在缺陷,这使得它们成为系统性能的异常不可靠的指标。我故意让我的“索引”值看起来非常不同,以避免与旧基准测试混淆。”
David 建立了一个 majordomo 邮件列表,用于讨论 Linux 和竞争操作系统上的基准测试。发送邮件到 majordomo@wauug.erols.com,邮件正文中包含“subscribe bench”即可加入。华盛顿地区 Unix 用户组也正在建立一个 网站,用于 Linux 基准测试。
最近,Uwe F. Mayer,mayer@math.vanderbilt.edu 也将 BYTE Bytemark 套件移植到了 Linux。这是一个现代套件,由 BYTE 杂志的 Rick Grehan 精心组装,用于测试现代微型计算机系统的 CPU、FPU 和内存系统性能(这些是严格面向处理器性能的基准测试,不考虑 I/O 或系统性能)。
Uwe 还建立了一个 网站,其中包含他的 Linux BYTEmark 基准测试版本测试结果的数据库。
在搜索 Linux 的综合基准测试时,您会注意到 sunsite.unc.edu 提供了很少的基准测试工具。为了测试 X 服务器和显卡的相对速度,Claus Gittinger 的 xbench-0.2 套件可以从 sunsite.unc.edu、ftp.x.org 和其他站点获得。Xfree86.org 拒绝(明智地)携带或推荐任何基准测试。
XFree86-benchmarks 调查是一个包含 x-bench 结果数据库的网站。
对于纯磁盘 I/O 吞吐量,hdparm 程序(大多数发行版都包含,否则可以从 sunsite.unc.edu 获得)将在使用 -t 和 -T 开关调用时测量传输速率。
互联网上还有许多其他免费提供的工具,用于测试您的 Linux 计算机的各种性能方面。
Dave Sill 的 comp.benchmarks.faq 是基准测试的标准参考。它不是特定于 Linux 的,但对于任何认真对待基准测试的人来说都是推荐阅读的。它可以从许多 FTP 和网站获得,并列出了 56 个不同的基准测试,以及指向承载它们的 FTP 或网站的链接。列出的某些基准测试是商业性的(例如 SPEC)。
我不会详细介绍 comp.benchmarks.faq 中提到的每个基准测试,但至少有一个低级套件我想评论一下:Larry McVoy 的 lmbench 套件。引用 David C. Niemi 的话
“Linus 和 David Miller 经常使用它,因为它进行了一些有用的低级测量,如果您有 2 台计算机进行测试,还可以测量网络吞吐量和延迟。但它并没有尝试提出任何类似总体“品质因数”的东西……”
Alfred Aburto 整理了一个相当完整的 FTP 站点,用于存放免费提供的基准测试。LBT 中使用的 Whetstone 套件可以在此站点找到。
Eugene Miya 的多部分 FAQ 定期发布到 comp.benchmarks;这是一个很好的参考。