基准测试通常需要运行多次。具体需要运行多少次要看对结果的记分方式,以及测试的重要程度。要提高测试的准确度,需要多运行几次。一般在测试的实践中,可以取好的结果值,或者所有结果的平均值,亦或从五个测试结果里取好三个值的平均值。可以根据需要更进一步精确化测试结果。还可以对结果使用统计方法,确定置信区间(confidence interval)等。不过通常来说,不会用到这种程度的确定性结果注8。只要测试的结果能满足目前的需求,简单地运行几轮测试,看看结果的变化可以了。如果结果变化很大,可以再多运行几次,或者运行更长的时间,这样都可以获得更确定的结果。

  获得测试结果后,还需要对结果进行分析,也是说,要把“数字”变成“知识”。终的目的是回答在设计测试时的问题。理想情况下,可以获得诸如“升级到4 核CPU 可以在保持响应时间不变的情况下获得超过50% 的吞吐量增长”或者“增加索引可以使查询更快”的结论。如果需要更加科学化,建议在测试前读读null hypothesis 一书,但大部分情况下不会要求做这么严格的基准测试。

  如何从数据中抽象出有意义的结果,依赖于如何收集数据。通常需要写一些脚本来分析数据,这不仅能减轻分析的工作量,而且和自动化基准测试一样可以重复运行,并易于文档化。下面是一个非常简单的shell 脚本,演示了如何从前面的数据采集脚本采集到的数据中抽取时间维度信息。脚本的输入参数是采集到的数据文件的名字。

  假设该脚本名为analyze,当前面的脚本生成状态文件以后,可以运行该脚本,可能会得到如下的结果:

  第一行是列的名字;第二行的数据应该忽略,因为这是测试实际启动前的数据。接下来的行包含Unix 时间戳、日期、时间(注意时间数据是每5 秒更新一次,前面脚本说明时曾提过)、系统负载、数据库的QPS(每秒查询次数)五列,这应该是用于分析系统性能的少数据需求了。接下来将演示如何根据这些数据快速地绘成图形,并分析基准测试过程中发生了什么。

  3.6 绘图的重要性

  如果你想要统治世界,必须不断地利用“阴谋”注9。而简单有效的图形,是将性能指标按照时间顺序绘制。通过图形可以立刻发现一些问题,而这些问题在原始数据中却很难被注意到。或许你会坚持看测试工具打印出来的平均值或其他汇总过的信息,但平均值有时候是没有用的,它会掩盖掉一些真实情况。幸运的是,前面写的脚本的输出都可以定制为gnuplot或者R绘图的数据来源。假设使用gnuplot,假设输出的数据文件名是QPS-per-5-seconds: