Databend 的设计目标之一就是保持最佳性能,为了更好观测和评估性能,社区不光提供一套简单的本地基准测试方案,还建立了可视化的持续基准测试。
hyperfine 是一种跨平台的命令行基准测试工具,支持预热和参数化基准测试。Databend 建议使用 hyperfine 通过 ClickHouse / MySQL 客户端执行基准测试,本文将使用 MySQL 客户端来介绍它。
进行本地基准测试之前,必须完成以下几项准备工作:
根据你的数据集特征和关键查询设计 SQL 语句,如果需要预先加载数据,请参考 Docs - Load Data 3 。
为方便示范,这里选用 Continuous Benchmarking - Vectorized Execution Benchmarking4 列出的 10 条语句,保存到 bench.sql 中。
SELECT avg(number) FROM numbers_mt(100000000000) SELECT sum(number) FROM numbers_mt(100000000000) SELECT min(number) FROM numbers_mt(100000000000) SELECT max(number) FROM numbers_mt(100000000000) SELECT count(number) FROM numbers_mt(100000000000) SELECT sum(number+number+number) FROM numbers_mt(100000000000) SELECT sum(number) / count(number) FROM numbers_mt(100000000000) SELECT sum(number) / count(number), max(number), min(number) FROM numbers_mt(100000000000) SELECT number FROM numbers_mt(10000000000) ORDER BY number DESC LIMIT 10 SELECT max(number), sum(number) FROM numbers_mt(1000000000) GROUP BY number % 3, number % 4, number % 5 LIMIT 10
下面给出一个 benchmark.sh 范本,可以简化整个基准测试流程:
#!/bin/bash WARMUP=3 RUN=10 export script="hyperfine -w $WARMUP -r $RUN" script="" function run() { port=$1 sql=$2 result=$3 script="hyperfine -w $WARMUP -r $RUN" while read SQL; do n="-n "$SQL" " s="echo "$SQL" | mysql -h127.0.0.1 -P$port -uroot -s" script="$script '$n' '$s'" done <<< $(cat $sql) script="$script --export-markdown $result" echo $script | bash -x } run "$1" "$2" "$3"
在这个脚本中:
在使用前需要先运行 chmod a+x ./benchmark.sh 赋予其可执行权限。用法如下所示:
./benchmark.sh <port> <sql> <result>
执行基准测试并获取结果:
在这个例子中,MySQL 兼容服务的端口是 3307 ,基准测试用到的 SQL 文件为 bench.sql , 预期的输出在 databend-hyperfine.md 。
./benchmark.sh 3307 bench.sql databend-hyperfine.md
当然,你可以根据自己的配置和需要进行调整。
注意:下面的示例是在 AMD Ryzen 9 5900HS & 16GB RAM 配置下运行产生,仅供参考。
终端中的输出如下所示:
Benchmark 1: "SELECT avg(number) FROM numbers_mt(100000000000)" Time (mean ± σ): 3.486 s ± 0.016 s [User: 0.003 s, System: 0.002 s] Range (min … max): 3.459 s … 3.506 s 10 runs
最终的结果会保存在 databend-hyperfine.md 中,如下所示。
Databend 的持续基准测试由 GitHub Action + Vercel + DatabendCloud 强力驱动,在 datafuselabs/databend-perf 5 这个 repo 中开源了源代码和 Workflow。
项目布局:
. ├── .github/workflows # 持续集成工作流 ├── benchmarks # YAML 格式的 SQL Query 测试套件 ├── collector # 分类存放性能数据 ├── front # 可视化前端 ├── reload # YAML 格式的 Data Load 测试套件 └── script # 数据预处理脚本
Workflow:
持续基准测试工作流定时计划执行,Perf Workflow 会在每天 00:25 UTC(北京时间 08:25)执行,Reload Workflow 会在每周五 08:25 UTC(北京时间 16:25)执行。
databend-perf 中的测试套件分为 Query Benchmark 和 Load Benchmark 两类,前者放在 benchmarks 目录下,后者放在 reload 目录下。测试用 YAML 格式定义:
metadata: table: numbers statements: - name: Q1 query: "SELECT avg(number) FROM numbers_mt(10000000000);"
metadata 中的 table 字段是必须的,且分配给每类 benchmark 的值都唯一。statements 则只需要指定 name 和 query 。
向量化执行基准测试:
定义在 benchmarks/numbers.yaml ,一组数值计算 SQL,利用 Databend 的 numbers 表函数提供百亿级别的数据量。完整语句也可以在 Continuous Benchmarking - Vectorized Execution Benchmarking6 查看。
Ontime 常见分析场景基准测试:
定义在 benchmarks/ontime.yaml ,一组常见的空中交通分析 SQL ,基于美国交通部公开的 OnTime 数据集,共计 202,687,654 条记录。当前此基准测试不包含 JOIN 语句,Q5、Q6、Q7 均采用优化后的形式。完整语句也可以在 Continuous Benchmarking - Ontime Benchmarking 7查看。
Ontime 数据集载入基准测试:
定义在 reload/ontime.yaml ,同样基于美国交通部公开的 OnTime 数据集,通过 s3 进行 COPY INTO 。
关键语句:
COPY INTO ontime FROM 's3://<bucket>/m_ontime/' credentials=(aws_key_id='AWS_KEY_ID' aws_secret_key='AWS_SECRET_KEY') pattern ='.*[.]csv' file_format=(type='CSV' field_delimiter='\t' record_delimiter='\n' skip_header=1);
上面 SQL 语句中的 m_ontime/ 目录即为数据集:由原来 60.8 GB 数据全部合并后,再拆分成 100 个大小相近的文件。
基准测试得到的数据是 Json 格式的,会分类存放到 collector 这个目录下。metadata 部分是包含表、版本、机器规格的信息;schema 部分则是对每条语句执行情况的统计,包括中位数、平均数等。示例:
{ "metadata":{ "table":"numbers", "tag":"v0.7.92-nightly", "size":"Large" }, "schema":[ { "name":"Q1", "sql":"SELECT avg(number) FROM numbers_mt(10000000000);", "min":0.305, "max":0.388, "median":0.354, "std_dev":0.02701407040784487, "read_row":10000000000, "read_byte":80000000000, "time":[ 0.315, 0.326, ... ], "error":[ ], "mean":0.34774024905853534 }, ... ] }
经由 stript/transform.go
处理,为每个查询的对应图表聚合数据,主要强调最大、最小、均值、中位数四个指标。
示例:
{ "title":"Q1", "sql":"SELECT avg(number) FROM numbers_mt(10000000000);", "lines":[ { "name":"min", "data":[ 3.084, 3.097, 3.043, ... ], ... } ], "version":[ "v0.7.0-nightly", "v0.7.1-nightly", "v0.7.2-nightly", ... ], "legend":[ "min", ... ], "xAxis":[ "2022-03-28", "2022-03-29", "2022-03-30", ... ], }
目前可视化方案采用 React + Echarts 实现,每个图表都对应上面处理得到的一个 Json 文件。在添加新的基准测试后,无需修改前端即可展现新的图表。
Graphs:
Compare:
Status:
目前 https://perf.databend.rs 为 Databend 提供了基本的持续性能监控方案,但仍然需要关注以下几个方向的内容:
https://databend.rs/doc/deploy ↩︎
https://github.com/sharkdp/hyperfine#installation ↩︎
https://databend.rs/doc/load-data ↩︎
https://databend.rs/doc/contributing/benchmarking#vectorized-execution-benchmarking ↩︎
https://github.com/datafuselabs/databend-perf/ ↩︎
https://databend.rs/doc/contributing/benchmarking#vectorized-execution-benchmarking ↩︎
https://databend.rs/doc/contributing/benchmarking#ontime-benchmarking ↩︎