基准测试

每个查询引擎在性能、可扩展性和资源要求方面都是独特的,往往有不同的权衡。拥有良好的基准测试以了解性能和伸缩性的特点是很重要的。

衡量性能

性能通常是最简单的测量特征,通常指的是执行一个特定操作所需的时间。例如,可以建立基准来测量特定查询或查询类别的性能。

性能测试通常包括多次执行查询并测量耗费的时间。

衡量伸缩性

伸缩性可能是一个有过多含义的术语,有许多不同类型的伸缩性。术语伸缩性通常指的是性能如何随着影响性能的某些变量的不同值而变化。

一个例子是,当查询 10GB 的数据与 100GB 或 1TB 的数据时,随着总数据量的增加而测量伸缩性,以发现性能是如何受到影响的。一个常见的目标是展示线性伸缩性,这意味着查询 100GB 的数据所需的时间应该是查询 10GB 数据的10倍。线性伸缩性使用户很容易推理出预期行为。

影响性能的其他变量的例子包括:

  • 并发用户、请求或查询的数量。
  • 数据分区的数量。
  • 物理磁盘的数量。
  • CPU 核的数量。
  • 节点的数量。
  • 可用 RAM 数量。
  • 硬件类型(例如,树莓派与桌面)。

并发

当根据并发请求的数量来衡量伸缩性时,我们通常对吞吐量(每段时间内执行的查询总数)更感兴趣,而不是单个查询的持续时间,尽管我们通常也会收集这一信息。

自动化

运行基准测试通常非常耗时,因此自动化是必不可少的,这样可以经常运行基准测试,也许是每天一次或每周一次,这样就能及早发现任何性能回退。

自动化对于确保一致地执行基准测试,以及收集结果和分析结果时可能需要的所有相关细节也很重要。

以下是执行基准测试时应收集的数据类型的一些示例。

硬件配置

  • 硬件类型
  • CPU核心的数量
  • 可用的内存和磁盘空间
  • 操作系统名称和版本

环境

  • 环境变量(注意不要泄露秘钥)

基准配置

  • 所用基准测试软件的版本
  • 被测软件的版本
  • 任何配置参数或文件
  • 正在查询的数据文件的文件名
  • 数据文件大小和校验和
  • 执行查询的细节

基准测试结果

  • 基准测试开始的日期 / 时间
  • 每个查询的开始时间和结束时间
  • 任何失败查询的错误信息

比较基准测试

在软件的不同版本之间比较基准测试是很重要的,这样性能特征的变化就很明显,可以进一步调查。基准测试产生了大量的数据,这些数据往往难以手工比较,因此,建立工具来帮助这一过程是有益的。

与其直接比较两组性能数据,工具可以对数据执行 “diff” 操作,并显示同一基准的两个或多个运行之间的百分比差异。能够制作显示多个基准测试运行的图表也很有用。

发布基准测试结果

下面是一些真实的基准测试结果的例子,比较了 Ballista 中 Rust 和 JVM 执行器的查询执行时间,与 Apache Spark 相比。虽然从这个数据中可以看出 Rust 执行器的表现很好,但通过制作图表可以更好地表现其优势。

CPU CoresBallista RustBallista JVMApache Spark
321.43151.14356.557
69.85526.00230.184
96.5124.43526.401
125.43517.52918.281

与其绘制查询执行时间图,不如绘制吞吐量图。在这种情况下,可以用 60 秒除以执行时间来计算每分钟查询的吞吐量。如果一个查询在单线程上执行需要 5 秒,那么每分钟应该可以运行 12 个查询。

下面是一个示例图表,展示了吞吐量随着 CPU 核数的增加的伸缩性。

(原文也缺少这张图)

本书的电子版、MOBI和PDF格式也可从 https://leanpub.com/how-query-engines-work 购买。

Copyright © 2020-2022 Grove Enterprises, LLC。保留所有权利。