> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> 如何构建 ClickHouse 并使用 DEFLATE_QPL 编解码器 运行基准测试

# 使用 DEFLATE_QPL 运行基准测试

* 确保你的主机满足 QPL 所需的[前置条件](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#prerequisites)

* 在 cmake 构建过程中，deflate\_qpl 默认已启用。如果你不小心改动了它，请再次确认构建标志：ENABLE\_QPL=1

* 关于通用要求，请参阅 ClickHouse 的通用[构建说明](/docs/zh/resources/develop-contribute/build/build)

<div id="files-list">
  ## 文件列表
</div>

[qpl-cmake](https://github.com/ClickHouse/ClickHouse/tree/master/contrib/qpl-cmake) 下的 `benchmark_sample` 文件夹提供了使用 Python 脚本运行基准测试的示例：

`client_scripts` 包含用于运行典型基准测试的 Python 脚本，例如：

* `client_stressing_test.py`：用于在 \[1\~4] 个服务器实例上执行查询压力测试的 Python 脚本。
* `queries_ssb.sql`：该文件列出了 [Star Schema Benchmark](/docs/zh/get-started/sample-datasets/star-schema) 的所有查询。
* `allin1_ssb.sh`：此 shell 脚本会自动执行一体化的基准测试工作流。

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

<div id="run-benchmark-automatically-for-star-schema">
  ## 自动运行 Star Schema 基准测试：
</div>

```bash theme={null}
$ cd ./benchmark_sample/client_scripts
$ sh run_ssb.sh
```

完成后，请检查此文件夹中的所有结果：`./output/`

如果运行失败，请按照以下各节手动运行基准测试。

<div id="definition">
  ## 定义
</div>

\[CLICKHOUSE\_EXE] 表示 ClickHouse 可执行文件的路径。

<div id="environment">
  ## 环境
</div>

* CPU：Sapphire Rapids
* OS 要求请参见 [QPL 系统要求](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#system-requirements)
* IAA 设置请参见 [加速器配置](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#accelerator-configuration)
* 安装 Python 模块：

```bash theme={null}
pip3 install clickhouse_driver numpy
```

\[IAA 自检]

```bash theme={null}
$ accel-config list | grep -P 'iax|state'
```

预期输出如下：

```bash theme={null}
    "dev":"iax1",
    "state":"enabled",
            "state":"enabled",
```

如果没有任何输出，说明 IAA 尚未就绪。请再次检查 IAA 的设置。

<div id="generate-raw-data">
  ## 生成原始数据
</div>

```bash theme={null}
$ cd ./benchmark_sample
$ mkdir rawdata_dir && cd rawdata_dir
```

使用 [`dbgen`](/docs/zh/get-started/sample-datasets/star-schema) 并通过以下参数生成 1 亿行数据：
-s 20

像 `*.tbl` 这样的文件应输出到 `./benchmark_sample/rawdata_dir/ssb-dbgen` 目录下：

<div id="database-setup">
  ## 数据库设置
</div>

使用 LZ4 编解码器配置数据库

```bash theme={null}
$ cd ./database_dir/lz4
$ [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null&
$ [CLICKHOUSE_EXE] client
```

此处你应该能在控制台中看到消息 `Connected to ClickHouse server`，这表示客户端已成功与服务器建立连接。

完成下方 [Star Schema Benchmark](/docs/zh/get-started/sample-datasets/star-schema) 中提到的三个步骤：

* 在 ClickHouse 中创建表
* 插入数据。此处应使用 `./benchmark_sample/rawdata_dir/ssb-dbgen/*.tbl` 作为输入数据。
* 将 "star schema" 转换为反规范化的 "flat schema"

使用 IAA Deflate 编解码器 设置数据库

```bash theme={null}
$ cd ./database_dir/deflate
$ [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null&
$ [CLICKHOUSE_EXE] client
```

按照上文 lz4 的说明完成相同的三个步骤

使用 ZSTD 编解码器设置数据库

```bash theme={null}
$ cd ./database_dir/zstd
$ [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null&
$ [CLICKHOUSE_EXE] client
```

完成与上文 lz4 相同的三个步骤

\[自检]
对于每种 编解码器 (lz4/zstd/deflate) ，请执行以下查询，确认数据库已成功创建：

```sql theme={null}
SELECT count() FROM lineorder_flat
```

你应该会看到如下输出：

```sql theme={null}
┌───count()─┐
│ 119994608 │
└───────────┘
```

\[IAA Deflate 编解码器自检]

首次从客户端执行插入或查询时，ClickHouse server 控制台应会输出以下日志：

```text theme={null}
Hardware-assisted DeflateQpl codec is ready!
```

如果你一直找不到这个，而是看到了如下另一条日志：

```text theme={null}
Initialization of hardware-assisted DeflateQpl codec failed
```

这意味着 IAA 设备尚未准备就绪，你需要重新检查 IAA 设置。

<div id="benchmark-with-single-instance">
  ### 单实例基准测试
</div>

* 在开始基准测试之前，请禁用 C6，并将 CPU 频率调控器设置为 `performance`

```bash theme={null}
$ cpupower idle-set -d 3
$ cpupower frequency-set -g performance
```

* 为了消除跨套接字内存绑定带来的影响，我们使用 `numactl` 将服务器绑定到一个套接字上，并将客户端绑定到另一个套接字上。
* 单实例表示单个服务器连接单个客户端

现在分别运行 LZ4/Deflate/ZSTD 的基准测试：

LZ4：

```bash theme={null}
$ 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：

```bash theme={null}
$ 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:

```bash theme={null}
$ 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
```

现在应会如预期输出三条日志：

```text theme={null}
lz4.log
deflate.log
zstd.log
```

如何检查性能指标：

我们重点关注 QPS，请搜索关键词：`QPS_Final` 并收集统计信息

<div id="benchmark-with-multi-instances">
  ## 使用多实例进行基准测试
</div>

* 为了减轻线程过多导致的内存瓶颈影响，我们建议使用多实例运行基准测试。
* 多实例是指多个 (2 个或 4 个) 服务器实例分别连接各自的客户端。
* 需要将一个 CPU 插槽上的核心平均划分，并分别分配给各个服务器实例。
* 对于多实例，必须为每个 编解码器 创建新的文件夹，并按照与单实例类似的步骤导入数据集。

有 2 点不同：

* 在客户端侧，你需要在创建表和插入数据时，使用分配好的端口启动 ClickHouse。
* 在服务器侧，你需要使用指定的 XML 配置文件启动 ClickHouse，其中已分配好端口。多实例所需的所有自定义 XML 配置文件均已在 ./server\_config 下提供。

这里假设每个 CPU 插槽有 60 个核心，并以 2 个实例为例。
启动第一个实例的服务器
LZ4:

```bash theme={null}
$ cd ./database_dir/lz4
$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null&
```

ZSTD:

```bash theme={null}
$ cd ./database_dir/zstd
$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null&
```

IAA Deflate：

```bash theme={null}
$ cd ./database_dir/deflate
$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null&
```

\[启动第二个实例的服务器]

LZ4:

```bash theme={null}
$ 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:

```bash theme={null}
$ 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：

```bash theme={null}
$ 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&
```

为第二个实例创建表 && 插入数据

创建表：

```bash theme={null}
$ [CLICKHOUSE_EXE] client -m --port=9001 
```

插入数据：

```bash theme={null}
$ [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:

```bash theme={null}
$ 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:

```bash theme={null}
$ 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

```bash theme={null}
$ 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 个实例/

现在应会按预期输出三条日志：

```text theme={null}
lz4_2insts.log
deflate_2insts.log
zstd_2insts.log
```

如何检查性能指标：

我们重点关注 QPS，请搜索关键词：`QPS_Final` 并收集统计信息

4 个实例的基准测试配置与上述 2 个实例类似。
我们建议使用 2 个实例的基准测试数据作为最终报告供评审。

<div id="tips">
  ## 提示
</div>

每次启动新的 ClickHouse server 之前，请务必确认没有 ClickHouse 后台进程正在运行；请检查并终止旧进程：

```bash theme={null}
$ ps -aux| grep clickhouse
$ kill -9 [PID]
```

将 ./client\_scripts/queries\_ssb.sql 中的查询列表与官方的 [Star Schema Benchmark](/docs/zh/get-started/sample-datasets/star-schema) 对比后，你会发现其中少了 3 个查询：Q1.2/Q1.3/Q3.4。这是因为这些查询的 CPU 利用率很低 (\< 10%) ，因此无法体现性能差异。
