如何對(duì) Databend 進(jìn)行基準(zhǔn)測試
Databend 的設(shè)計(jì)目標(biāo)之一就是保持最佳性能,為了更好觀測和評(píng)估性能,社區(qū)不光提供一套簡單的本地基準(zhǔn)測試方案,還建立了可視化的持續(xù)基準(zhǔn)測試。
本地基準(zhǔn)測試
hyperfine 是一種跨平臺(tái)的命令行基準(zhǔn)測試工具,支持預(yù)熱和參數(shù)化基準(zhǔn)測試。Databend 建議使用 hyperfine 通過 ClickHouse / MySQL 客戶端執(zhí)行基準(zhǔn)測試,本文將使用 MySQL 客戶端來介紹它。
前期準(zhǔn)備:
進(jìn)行本地基準(zhǔn)測試之前,必須完成以下幾項(xiàng)準(zhǔn)備工作:
參照?Docs - Deploy Databend1?完成部署。
安裝 MySQL 客戶端。
根據(jù)?hyperfine - installation2?的提示安裝 hyperfine。
設(shè)計(jì)基準(zhǔn)測試套件:
根據(jù)你的數(shù)據(jù)集特征和關(guān)鍵查詢?cè)O(shè)計(jì) SQL 語句,如果需要預(yù)先加載數(shù)據(jù),請(qǐng)參考?Docs - Load Data?3?。
為方便示范,這里選用?Continuous Benchmarking - Vectorized Execution Benchmarking4?列出的 10 條語句,保存到 bench.sql 中。
使用 bash 腳本簡化流程:
下面給出一個(gè) benchmark.sh 范本,可以簡化整個(gè)基準(zhǔn)測試流程:
在這個(gè)腳本中:
使用?-w/--warmup & WARMUP 在實(shí)際基準(zhǔn)測試之前運(yùn)行 3 次程序執(zhí)行來預(yù)熱。
使用?-r/--runs & RUN 要求執(zhí)行 10 次基準(zhǔn)測試。
允許指定 Databend MySQL 兼容服務(wù)的端口。
允許指定輸入的 SQL 文件,以及輸出時(shí)的 Markdown 文件。
在使用前需要先運(yùn)行 chmod a+x ./benchmark.sh 賦予其可執(zhí)行權(quán)限。用法如下所示:
執(zhí)行基準(zhǔn)測試并獲取結(jié)果:
在這個(gè)例子中,MySQL 兼容服務(wù)的端口是 3307 ,基準(zhǔn)測試用到的 SQL 文件為 bench.sql , 預(yù)期的輸出在 databend-hyperfine.md 。
當(dāng)然,你可以根據(jù)自己的配置和需要進(jìn)行調(diào)整。
注意:下面的示例是在 AMD Ryzen 9 5900HS & 16GB RAM 配置下運(yùn)行產(chǎn)生,僅供參考。
終端中的輸出如下所示:
最終的結(jié)果會(huì)保存在 databend-hyperfine.md 中,如下所示。

持續(xù)基準(zhǔn)測試
Databend 的持續(xù)基準(zhǔn)測試由 GitHub Action + Vercel + DatabendCloud 強(qiáng)力驅(qū)動(dòng),在?datafuselabs/databend-perf?5?這個(gè) repo 中開源了源代碼和 Workflow。
基本介紹
項(xiàng)目布局:
Workflow:
持續(xù)基準(zhǔn)測試工作流定時(shí)計(jì)劃執(zhí)行,Perf Workflow 會(huì)在每天 00:25 UTC(北京時(shí)間 08:25)執(zhí)行,Reload Workflow 會(huì)在每周五 08:25 UTC(北京時(shí)間 16:25)執(zhí)行。
通過 GitHub API 獲取當(dāng)前日期和最新版本的 TAG 。
利用 perf-tool 和 DatabendCloud 進(jìn)行交互,運(yùn)行測試。
持久化性能數(shù)據(jù)到 databend-perf 這一 repo 中 。
執(zhí)行腳本處理數(shù)據(jù),使之生成前端需要的格式。
構(gòu)建前端,完成可視化。
測試套件:
databend-perf 中的測試套件分為 Query Benchmark 和 Load Benchmark 兩類,前者放在 benchmarks 目錄下,后者放在 reload 目錄下。測試用 YAML 格式定義:
metadata 中的 table 字段是必須的,且分配給每類 benchmark 的值都唯一。statements 則只需要指定 name 和 query 。
向量化執(zhí)行基準(zhǔn)測試:
定義在 benchmarks/numbers.yaml ,一組數(shù)值計(jì)算 SQL,利用 Databend 的 numbers 表函數(shù)提供百億級(jí)別的數(shù)據(jù)量。完整語句也可以在?Continuous Benchmarking - Vectorized Execution Benchmarking6?查看。
Ontime 常見分析場景基準(zhǔn)測試:
定義在 benchmarks/ontime.yaml ,一組常見的空中交通分析 SQL ,基于美國交通部公開的 OnTime 數(shù)據(jù)集,共計(jì) 202,687,654 條記錄。當(dāng)前此基準(zhǔn)測試不包含 JOIN 語句,Q5、Q6、Q7 均采用優(yōu)化后的形式。完整語句也可以在?Continuous Benchmarking - Ontime Benchmarking?7查看。
Ontime 數(shù)據(jù)集載入基準(zhǔn)測試:
定義在 reload/ontime.yaml ,同樣基于美國交通部公開的 OnTime 數(shù)據(jù)集,通過 s3 進(jìn)行 COPY INTO 。
關(guān)鍵語句:
上面 SQL 語句中的 m_ontime/?目錄即為數(shù)據(jù)集:由原來 60.8 GB 數(shù)據(jù)全部合并后,再拆分成 100 個(gè)大小相近的文件。
數(shù)據(jù)處理:
基準(zhǔn)測試得到的數(shù)據(jù)是 Json 格式的,會(huì)分類存放到 collector 這個(gè)目錄下。metadata 部分是包含表、版本、機(jī)器規(guī)格的信息;schema 部分則是對(duì)每條語句執(zhí)行情況的統(tǒng)計(jì),包括中位數(shù)、平均數(shù)等。示例:
經(jīng)由?stript/transform.go
?處理,為每個(gè)查詢的對(duì)應(yīng)圖表聚合數(shù)據(jù),主要強(qiáng)調(diào)最大、最小、均值、中位數(shù)四個(gè)指標(biāo)。
示例:
可視化:
目前可視化方案采用 React + Echarts 實(shí)現(xiàn),每個(gè)圖表都對(duì)應(yīng)上面處理得到的一個(gè) Json 文件。在添加新的基準(zhǔn)測試后,無需修改前端即可展現(xiàn)新的圖表。
Graphs:?

以折線圖的形式展示性能變化,并支持通過拖動(dòng)圖表下方的選擇器調(diào)整展示的時(shí)間區(qū)間。
橫軸為日期,縱軸為執(zhí)行用時(shí),鼠標(biāo)懸浮到上方即可查看當(dāng)次執(zhí)行的信息。
Compare:?

支持任選兩天對(duì)比執(zhí)行用時(shí)的變化,以百分比形式展示。
Status:?

關(guān)注當(dāng)前最新性能測試結(jié)果中各指標(biāo)的情況,以柱型圖展示。
橫軸為不同類型,縱軸為執(zhí)行用時(shí)。
后續(xù)優(yōu)化
目前?https://perf.databend.rs?為 Databend 提供了基本的持續(xù)性能監(jiān)控方案,但仍然需要關(guān)注以下幾個(gè)方向的內(nèi)容:
選取更有代表性的指標(biāo):執(zhí)行次數(shù)較少(只有 10 次),可供選擇的指標(biāo)可能不夠具有代表性。例如:將次數(shù)提高到 100 次以獲取 P90 來替代當(dāng)前使用的中位數(shù)可能是比較合適的。
增加性能測試場景的覆蓋:后續(xù)可以繼續(xù)新增對(duì)其他數(shù)據(jù)集和場景的性能測試,比如 ssb 、hits 。
豐富性能監(jiān)控的方向:監(jiān)控 IO 和網(wǎng)絡(luò)性能表現(xiàn),對(duì)部分重點(diǎn)查詢提供額外的性能評(píng)估,比如解析 Json 的性能表現(xiàn)。
關(guān)于 Databend
Databend 是一款開源、彈性、低成本,基于對(duì)象存儲(chǔ)也可以做實(shí)時(shí)分析的新式數(shù)倉。期待您的關(guān)注,一起探索云原生數(shù)倉解決方案,打造新一代開源 Data Cloud。
Databend 文檔:https://databend.rs/
Twitter:https://twitter.com/Datafuse_Labs
Slack:https://datafusecloud.slack.com/
Wechat:Databend
GitHub :https://github.com/datafuselabs/databend

Footnotes
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??