-
确保你的主机满足 QPL 所需的前置条件
-
在 cmake 构建过程中,deflate_qpl 默认已启用。如果你不小心改动了它,请再次确认构建标志:ENABLE_QPL=1
-
关于通用要求,请参阅 ClickHouse 的通用构建说明
文件列表
qpl-cmake 下的 benchmark_sample 文件夹提供了使用 Python 脚本运行基准测试的示例:
client_scripts 包含用于运行典型基准测试的 Python 脚本,例如:
client_stressing_test.py:用于在 [1~4] 个服务器实例上执行查询压力测试的 Python 脚本。queries_ssb.sql:该文件列出了 Star Schema Benchmark 的所有查询。allin1_ssb.sh:此 shell 脚本会自动执行一体化的基准测试工作流。
database_files 表示将按 lz4/deflate/zstd 编解码器 存储数据库文件。
自动运行 Star Schema 基准测试:
$ cd ./benchmark_sample/client_scripts
$ sh run_ssb.sh完成后,请检查此文件夹中的所有结果:./output/
如果运行失败,请按照以下各节手动运行基准测试。
定义
[CLICKHOUSE_EXE] 表示 ClickHouse 可执行文件的路径。
环境
pip3 install clickhouse_driver numpy[IAA 自检]
$ accel-config list | grep -P 'iax|state'预期输出如下:
"dev":"iax1",
"state":"enabled",
"state":"enabled",如果没有任何输出,说明 IAA 尚未就绪。请再次检查 IAA 的设置。
生成原始数据
$ cd ./benchmark_sample
$ mkdir rawdata_dir && cd rawdata_dir使用 dbgen 并通过以下参数生成 1 亿行数据:
-s 20
像 *.tbl 这样的文件应输出到 ./benchmark_sample/rawdata_dir/ssb-dbgen 目录下:
数据库设置
使用 LZ4 编解码器配置数据库
$ cd ./database_dir/lz4
$ [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null&
$ [CLICKHOUSE_EXE] client此处你应该能在控制台中看到消息 Connected to ClickHouse server,这表示客户端已成功与服务器建立连接。
完成下方 Star Schema Benchmark 中提到的三个步骤:
- 在 ClickHouse 中创建表
- 插入数据。此处应使用
./benchmark_sample/rawdata_dir/ssb-dbgen/*.tbl作为输入数据。 - 将 "star schema" 转换为反规范化的 "flat schema"
使用 IAA Deflate 编解码器 设置数据库
$ cd ./database_dir/deflate
$ [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null&
$ [CLICKHOUSE_EXE] client按照上文 lz4 的说明完成相同的三个步骤
使用 ZSTD 编解码器设置数据库
$ cd ./database_dir/zstd
$ [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null&
$ [CLICKHOUSE_EXE] client完成与上文 lz4 相同的三个步骤
[自检] 对于每种 编解码器 (lz4/zstd/deflate) ,请执行以下查询,确认数据库已成功创建:
SELECT count() FROM lineorder_flat你应该会看到如下输出:
┌[IAA Deflate 编解码器自检]
首次从客户端执行插入或查询时,ClickHouse server 控制台应会输出以下日志:
Hardware-assisted DeflateQpl codec is ready!如果你一直找不到这个,而是看到了如下另一条日志:
Initialization of hardware-assisted DeflateQpl codec failed这意味着 IAA 设备尚未准备就绪,你需要重新检查 IAA 设置。
单实例基准测试
- 在开始基准测试之前,请禁用 C6,并将 CPU 频率调控器设置为
performance
$ cpupower idle-set -d 3
$ cpupower frequency-set -g performance- 为了消除跨套接字内存绑定带来的影响,我们使用
numactl将服务器绑定到一个套接字上,并将客户端绑定到另一个套接字上。 - 单实例表示单个服务器连接单个客户端
现在分别运行 LZ4/Deflate/ZSTD 的基准测试:
LZ4:
$ cd ./database_dir/lz4
$ numactl -m 0 -N 0 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null&
$ cd ./client_scripts
$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 1 > lz4.logIAA deflate:
$ cd ./database_dir/deflate
$ numactl -m 0 -N 0 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null&
$ cd ./client_scripts
$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 1 > deflate.logZSTD:
$ cd ./database_dir/zstd
$ numactl -m 0 -N 0 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null&
$ cd ./client_scripts
$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 1 > zstd.log现在应会如预期输出三条日志:
lz4.log
deflate.log
zstd.log如何检查性能指标:
我们重点关注 QPS,请搜索关键词:QPS_Final 并收集统计信息
使用多实例进行基准测试
- 为了减轻线程过多导致的内存瓶颈影响,我们建议使用多实例运行基准测试。
- 多实例是指多个 (2 个或 4 个) 服务器实例分别连接各自的客户端。
- 需要将一个 CPU 插槽上的核心平均划分,并分别分配给各个服务器实例。
- 对于多实例,必须为每个 编解码器 创建新的文件夹,并按照与单实例类似的步骤导入数据集。
有 2 点不同:
- 在客户端侧,你需要在创建表和插入数据时,使用分配好的端口启动 ClickHouse。
- 在服务器侧,你需要使用指定的 XML 配置文件启动 ClickHouse,其中已分配好端口。多实例所需的所有自定义 XML 配置文件均已在 ./server_config 下提供。
这里假设每个 CPU 插槽有 60 个核心,并以 2 个实例为例。 启动第一个实例的服务器 LZ4:
$ cd ./database_dir/lz4
$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null&ZSTD:
$ cd ./database_dir/zstd
$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null&IAA Deflate:
$ cd ./database_dir/deflate
$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null&[启动第二个实例的服务器]
LZ4:
$ cd ./database_dir && mkdir lz4_s2 && cd lz4_s2
$ cp ../../server_config/config_lz4_s2.xml ./
$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_lz4_s2.xml >&/dev/null&ZSTD:
$ cd ./database_dir && mkdir zstd_s2 && cd zstd_s2
$ cp ../../server_config/config_zstd_s2.xml ./
$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_zstd_s2.xml >&/dev/null&IAA Deflate:
$ cd ./database_dir && mkdir deflate_s2 && cd deflate_s2
$ cp ../../server_config/config_deflate_s2.xml ./
$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_deflate_s2.xml >&/dev/null&为第二个实例创建表 && 插入数据
创建表:
$ [CLICKHOUSE_EXE] client -m --port=9001 插入数据:
$ [CLICKHOUSE_EXE] client --query "INSERT INTO [TBL_FILE_NAME] FORMAT CSV" < [TBL_FILE_NAME].tbl --port=9001- [TBL_FILE_NAME] 表示文件名,需匹配以下正则表达式:*. tbl,文件位于
./benchmark_sample/rawdata_dir/ssb-dbgen。 --port=9001表示为服务器实例分配的端口,该端口也在 config_lz4_s2.xml/config_zstd_s2.xml/config_deflate_s2.xml 中定义。若要使用更多实例,需要将其替换为 9002/9003,分别对应 s3/s4 实例。如果不指定,默认端口为 9000,而该端口已被第一个实例占用。
使用 2 个实例进行基准测试
LZ4:
$ cd ./database_dir/lz4
$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null&
$ cd ./database_dir/lz4_s2
$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_lz4_s2.xml >&/dev/null&
$ cd ./client_scripts
$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 2 > lz4_2insts.logZSTD:
$ cd ./database_dir/zstd
$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null&
$ cd ./database_dir/zstd_s2
$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_zstd_s2.xml >&/dev/null&
$ cd ./client_scripts
$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 2 > zstd_2insts.logIAA deflate
$ cd ./database_dir/deflate
$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null&
$ cd ./database_dir/deflate_s2
$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_deflate_s2.xml >&/dev/null&
$ cd ./client_scripts
$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 2 > deflate_2insts.log这里,client_stressing_test.py 的最后一个参数 2 表示实例数量。若需更多实例,请将其替换为 3 或 4。此脚本最多支持 4 个实例/
现在应会按预期输出三条日志:
lz4_2insts.log
deflate_2insts.log
zstd_2insts.log如何检查性能指标:
我们重点关注 QPS,请搜索关键词:QPS_Final 并收集统计信息
4 个实例的基准测试配置与上述 2 个实例类似。 我们建议使用 2 个实例的基准测试数据作为最终报告供评审。
提示
每次启动新的 ClickHouse server 之前,请务必确认没有 ClickHouse 后台进程正在运行;请检查并终止旧进程:
$ ps -aux| grep clickhouse
$ kill -9 [PID]将 ./client_scripts/queries_ssb.sql 中的查询列表与官方的 Star Schema Benchmark 对比后,你会发现其中少了 3 个查询:Q1.2/Q1.3/Q3.4。这是因为这些查询的 CPU 利用率很低 (< 10%) ,因此无法体现性能差异。