跳至主要内容

使用 DEFLATE_QPL 构建 ClickHouse

  • 确保您的主机满足 QPL 所需的 先决条件

  • 在 cmake 构建期间默认启用 deflate_qpl。如果您不小心更改了它,请仔细检查构建标志:ENABLE_QPL=1

  • 有关通用要求,请参阅 Clickhouse 通用 构建说明

使用 DEFLATE_QPL 运行基准测试

文件列表

文件夹 benchmark_sampleqpl-cmake 中给出了使用 python 脚本运行基准测试的示例

client_scripts 包含用于运行典型基准测试的 python 脚本,例如

  • client_stressing_test.py:用于使用[1~4]服务器实例进行查询压力测试的 python 脚本。
  • queries_ssb.sql:列出所有查询的文件 星型模式基准测试
  • allin1_ssb.sh:此 shell 脚本自动执行一键式基准测试工作流程。

database_files 表示它将根据 lz4/deflate/zstd 编解码器存储数据库文件。

自动运行星型模式基准测试:

$ 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

您应该在控制台中看到消息 已连接到 ClickHouse 服务器,这意味着客户端已成功与服务器建立连接。

完成 星型模式基准测试 中提到的以下三个步骤

  • 在 ClickHouse 中创建表
  • 插入数据。这里应该使用 ./benchmark_sample/rawdata_dir/ssb-dbgen/*.tbl 作为输入数据。
  • 将“星型模式”转换为非规范化的“扁平模式”

使用 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

您应该看到以下输出

┌───count()─┐
119994608
└───────────┘

[IAA Deflate 编解码器自检]

第一次从客户端执行插入或查询时,ClickHouse 服务器控制台预计会打印此日志

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.log

IAA 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.log

ZSTD

$ 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)服务器连接到各自的客户端。
  • 一个套接字的核心需要平均分配并分别分配给服务器。
  • 对于多实例,必须为每个编解码器创建新文件夹,并按照与单实例类似的步骤插入数据集。

有两个区别

  • 对于客户端,您需要在创建表和插入数据时使用分配的端口启动 ClickHouse。
  • 对于服务器端,您需要使用特定 xml 配置文件启动 ClickHouse,其中已分配端口。所有用于多实例的自定义 xml 配置文件都已提供在 ./server_config 下。

这里假设每个套接字有 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]表示一个以正则表达式命名的文件:./benchmark_sample/rawdata_dir/ssb-dbgen 下的 *.tbl。
  • --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.log

ZSTD

$ 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.log

IAA 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 服务器之前,请确保没有后台 ClickHouse 进程正在运行,请检查并终止旧进程

$ ps -aux| grep clickhouse
$ kill -9 [PID]

通过将 ./client_scripts/queries_ssb.sql 中的查询列表与官方 星型模式基准测试 进行比较,您会发现 3 个查询未包含:Q1.2/Q1.3/Q3.4。这是因为这些查询的 CPU 利用率% 非常低 <10%,这意味着无法展示性能差异。