Databend 的设计指标之一就是放弃最佳性能,为了更好观测和评估性能,社区不光提供一套简略的本地基准测试计划,还建设了可视化的继续基准测试。

本地基准测试

hyperfine 是一种跨平台的命令行基准测试工具,反对预热和参数化基准测试。Databend 倡议应用 hyperfine 通过 ClickHouse / MySQL 客户端执行基准测试,本文将应用 MySQL 客户端来介绍它。

后期筹备:

进行本地基准测试之前,必须实现以下几项筹备工作:

  • 参照 Docs - Deploy Databend1 实现部署。
  • 装置 MySQL 客户端。
  • 依据 hyperfine - installation2 的提醒装置 hyperfine。

设计基准测试套件:

依据你的数据集特色和要害查问设计 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 10SELECT max(number), sum(number) FROM numbers_mt(1000000000) GROUP BY number % 3, number % 4, number % 5 LIMIT 10

应用 bash 脚本简化流程:

上面给出一个 benchmark.sh 范本,能够简化整个基准测试流程:

#!/bin/bashWARMUP=3RUN=10export 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"

在这个脚本中:

  • 应用 -w/--warmup & WARMUP 在理论基准测试之前运行 3 次程序执行来预热。
  • 应用 -r/--runs & RUN 要求执行 10 次基准测试。
  • 容许指定 Databend MySQL 兼容服务的端口。
  • 容许指定输出的 SQL 文件,以及输入时的 Markdown 文件。

在应用前须要先运行 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)执行。

  1. 通过 GitHub API 获取以后日期和最新版本的 TAG 。
  2. 利用 perf-tool 和 DatabendCloud 进行交互,运行测试。
  3. 长久化性能数据到 databend-perf 这一 repo 中 。
  4. 执行脚本解决数据,使之生成前端须要的格局。
  5. 构建前端,实现可视化。

测试套件:

databend-perf 中的测试套件分为 Query Benchmark 和 Load Benchmark 两类,前者放在 benchmarks 目录下,后者放在 reload 目录下。测试用 YAML 格局定义:

metadata:  table: numbersstatements:  - 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 提供了根本的继续性能监控计划,但依然须要关注以下几个方向的内容:

  • 选取更有代表性的指标:执行次数较少(只有 10 次),可供选择的指标可能不够具备代表性。例如:将次数进步到 100 次以获取 P90 来代替以后应用的中位数可能是比拟适合的。
  • 减少性能测试场景的笼罩:后续能够持续新增对其余数据集和场景的性能测试,比方 ssb 、hits 。
  • 丰盛性能监控的方向:监控 IO 和网络性能体现,对局部重点查问提供额定的性能评估,比方解析 Json 的性能体现。

对于 Databend

Databend 是一款开源、弹性、低成本,基于对象存储也能够做实时剖析的旧式数仓。期待您的关注,一起摸索云原生数仓解决方案,打造新一代开源 Data Cloud。

  • Databend 文档:https://databend.rs/
  • Twitter:https://twitter.com/Datafuse_...
  • Slack:https://datafusecloud.slack.com/
  • Wechat:Databend
  • GitHub :https://github.com/datafusela...

文章首发于公众号:Databned


  1. https://databend.rs/doc/deploy ↩
  2. https://github.com/sharkdp/hy... ↩
  3. https://databend.rs/doc/load-... ↩
  4. https://databend.rs/doc/contr... ↩
  5. https://github.com/datafusela... ↩
  6. https://databend.rs/doc/contr... ↩
  7. https://databend.rs/doc/contr... ↩