blob: 78818a0d3ad228655761897faa34e4e00dbf526b [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# 测试工具
IoT Benchmark 是面向工业物联网(IIoT)场景的时序数据库、实时数据库基准测试工具。本手册介绍工具的主要能力、支持的数据库及基本使用方法;安装、配置和测试案例主要以 IoTDB 2\.0\.x 为例,并同时覆盖树模型和表模型。
![](/img/bm2.png)
## 1\. 基本概述
IoT Benchmark 可以按照配置生成周期性时间序列数据,对数据库执行写入和查询,并统计吞吐、延迟及成功率等指标。主要能力包括:
- 跨平台运行:支持 Linux、macOS 和 Windows。
- 多种负载:支持纯写入、纯查询及读写混合负载。
- 数据集生成:可将生成的数据保存到磁盘,供重复测试使用。
- 正确性验证:可从磁盘加载数据集,执行写入和查询正确性验证。
- 多数据库支持:可对多种时序数据库和实时数据库执行测试;IoTDB 2\.0\.x 支持 JDBC、REST 和多种 Session 写入方式。
- 结果持久化:支持将测试过程和结果保存到文件、CSV、MySQL 或 IoTDB。
- 测试扩展:支持乱序写入、批量写入、集群压测、双写对比和结果可视化等场景。
### 1\.1 支持的数据库、版本和接入方式
IoT Benchmark 支持如下数据库和版本。测试时通过 `DB_SWITCH` 选择对应的数据库、版本及连接或写入方式。
|数据库|支持版本|`DB_SWITCH`|
|---|---|---|
|IoTDB|v1\.x|`IoTDB-130-JDBC`、`IoTDB-130-REST`、`IoTDB-130-SESSION_BY_TABLET`、`IoTDB-130-SESSION_BY_RECORD`、`IoTDB-130-SESSION_BY_RECORDS`|
|IoTDB|v2\.x|`IoTDB-200-JDBC`、`IoTDB-200-REST`、`IoTDB-200-SESSION_BY_TABLET`、`IoTDB-200-SESSION_BY_RECORD`、`IoTDB-200-SESSION_BY_RECORDS`|
|InfluxDB|v1\.x|`InfluxDB`|
|InfluxDB|v2\.x|`InfluxDB-2.x`|
|QuestDB|v6\.0\.7|`QuestDB`|
|Microsoft SQL Server|2016 SP2|`MSSQLSERVER`|
|VictoriaMetrics|v1\.64\.0|`VictoriaMetrics`|
|SQLite|—|`SQLite`|
|OpenTSDB|2\.4\.1|`OpenTSDB`|
|KairosDB|—|`KairosDB`|
|TimescaleDB|—|`TimescaleDB`|
|TimescaleDB Cluster|Cluster|`TimescaleDB-Cluster`|
|TDengine|2\.2\.0\.2|`TDengine`|
|TDengine|3\.0\.1|`TDengine-3`|
|DolphinDB|v2\.x|`DolphinDB-2-MTW`、`DolphinDB-2-PTA`|
|DolphinDB|v3\.x|`DolphinDB-3-MTW`、`DolphinDB-3-PTA`|
|CnosDB|—|`CnosDB`|
其中:
- IoTDB 的接入方式包括 JDBC、REST、Session by Tablet、Session by Record 和 Session by Records。
- DolphinDB 的 `MTW` 表示 `MultithreadedTableWriter`,按行缓冲写入;`PTA` 表示 `PartitionedTableAppender`,按批次进行列式整表追加。
- 数据库版本、驱动和服务端必须相互匹配。使用其他数据库时,还需要配置相应的连接及扩展参数。
### 1\.2 IoTDB 2\.0\.x 接入方式
后续安装、配置和案例以 IoTDB 2\.0\.x 为主。支持的接入方式如下。
|接入方式|`DB_SWITCH`|说明|
|---|---|---|
|JDBC|`IoTDB-200-JDBC`|通过 JDBC 执行写入和查询|
|REST|`IoTDB-200-REST`|通过 IoTDB REST 接口执行测试|
|Session by Tablet|`IoTDB-200-SESSION_BY_TABLET`|使用 Tablet 批量写入|
|Session by Record|`IoTDB-200-SESSION_BY_RECORD`|逐条写入记录|
|Session by Records|`IoTDB-200-SESSION_BY_RECORDS`|批量写入多条记录|
`IoTDB-200-SESSION_BY_TABLET` 适用于批量写入测试。
## 2\. 安装运行
本章以 IoTDB 2\.0\.x 作为被测数据库。
### 2\.1 前置条件
1. 使用 IoT Benchmark 前需要准备:
- Java 17。
- Maven。
- 已安装并能够正常运行的 IoTDB 2\.0\.x。
- 足够的客户端 CPU、内存、磁盘和网络资源。
2. 环境相关说明:
- 推荐使用 Linux 或 macOS 执行测试。
- Windows 使用安装包根目录下的 `benchmark.bat` 启动测试。
- Linux 和 macOS 使用 `benchmark.sh` 启动测试。
- CSV 记录模式中的部分系统信息采集能力仅支持 Linux。
> 注意:不要将 IoT Benchmark 与被测 IoTDB 部署在资源相互竞争的环境中。正式性能测试建议使用独立服务器,并关闭无关服务。
>
>
### 2\.2 获取方式
1. 获取发行包
可以从 [IoT Benchmark Releases](https://github.com/thulab/iot-benchmark/releases) 下载与测试目标匹配的发行包,解压后使用。
2. 从源码构建
克隆仓库:
```Bash
git clone https://github.com/thulab/iot-benchmark.git
cd iot-benchmark
```
在项目根目录执行:
```Bash
mvn clean package -Dmaven.test.skip=true
```
构建完成后,IoTDB 2\.0\.x 安装包位于:
```Plain Text
iotdb-2.0/target/iot-benchmark-iotdb-2.0/iot-benchmark-iotdb-2.0
```
进入安装目录:
```Bash
cd iotdb-2.0/target/iot-benchmark-iotdb-2.0/iot-benchmark-iotdb-2.0
```
### 2\.3 测试包结构
安装包中的常用文件和目录如下。
|名称|用途|
|---|---|
|`benchmark.sh`|Linux、macOS 启动脚本|
|`benchmark.bat`|Windows 启动脚本|
|`conf/config.properties`|测试场景配置文件|
|`lib/`|运行依赖库|
|`logs/`|测试日志,首次运行后生成|
|`data/`|数据集或持久化结果目录,按工作模式和持久化配置生成|
### 2\.4 执行测试
1. 启动 IoTDB
首先启动目标 IoTDB 2\.0\.x,并确认客户端能够访问其服务端口。默认原生接口端口为 `6667`。
2. 修改配置
- 编辑 `conf/config.properties`
- 最小连接配置示例:
```Properties
DB_SWITCH=IoTDB-200-SESSION_BY_TABLET
IoTDB_DIALECT_MODE=tree
HOST=127.0.0.1
PORT=6667
USERNAME=root
PASSWORD=root
DB_NAME=test
```
- 使用表模型时改为:
```Properties
IoTDB_DIALECT_MODE=table
```
- 如果选择 REST:
```Properties
DB_SWITCH=IoTDB-200-REST
REST_PORT=18080
REST_AUTHORIZATION=Basic cm9vdDpyb290
```
`REST_AUTHORIZATION `用于配置 REST 接口的 `Basic Authentication` 信息。示例使用用户名 root、密码 root。
3. 检查 RPC 压缩兼容性
IoT Benchmark 2\.0 默认开启 IoTDB RPC 压缩:
```Properties
ENABLE_IOTDB_RPC_COMPRESSION=true
```
该功能要求被测 IoTDB 版本为 2\.0\.6 或更高版本。如果测试 2\.0\.6 之前的 IoTDB 2\.0\.x,请设置:
```Properties
ENABLE_IOTDB_RPC_COMPRESSION=false
```
Thrift 压缩是另一项独立配置。如果启用:
```Properties
ENABLE_THRIFT_COMPRESSION=true
```
还需要在 IoTDB 的 `iotdb-datanode.properties` 中设置:
```Properties
dn_rpc_thrift_compression_enable=true
```
4. 启动 Benchmark
Linux 或 macOS:
```Bash
./benchmark.sh
```
Windows:
```Plain Text
benchmark.bat
```
测试过程中终端会周期性输出进度。完成后会输出主要配置、执行时间、结果矩阵和延迟矩阵。
### 2\.5 结果说明
测试执行信息会写入安装目录下的 `logs` 文件夹。是否生成 CSV 或写入结果数据库由 `TEST_DATA_PERSISTENCE` 等参数决定。
1. 结果矩阵
结果矩阵按操作类型统计以下指标:
|指标|说明|
|---|---|
|`okOperation`|成功执行的请求或 SQL 数量|
|`okPoint`|写入成功的数据点数,或查询成功返回的数据点数|
|`failOperation`|执行失败的请求或 SQL 数量|
|`failPoint`|写入失败的数据点数;查询操作通常为 0|
|`throughput`|吞吐量,通常等于 `okPoint / Test elapsed time`|
输出中的主要操作名称包括:
- `INGESTION`
- `PRECISE_POINT`
- `TIME_RANGE`
- `VALUE_RANGE`
- `AGG_RANGE`
- `AGG_VALUE`
- `AGG_RANGE_VALUE`
- `GROUP_BY`
- `LATEST_POINT`
- `RANGE_QUERY_DESC`
- `VALUE_RANGE_QUERY_DESC`
- `GROUP_BY_DESC`
- `SET_OP_QUERY`
2. 延迟矩阵
延迟矩阵以毫秒为单位,常见字段如下:
|指标|说明|
|---|---|
|`AVG`|平均延迟|
|`MIN`|最小延迟|
|`P10`、`P25`、`MEDIAN`|低分位和中位延迟|
|`P75`、`P90`、`P95`|较高分位延迟|
|`P99`、`P999`|尾延迟|
|`MAX`|最大延迟|
|`SLOWEST_THREAD`|客户端线程中最大的累计操作时间|
测试结果还会给出元数据创建耗时和不包含元数据创建的 `Test elapsed time`。对比测试时,应确保各轮测试的硬件、数据量、客户端数、压缩配置和缓存状态一致。
3. 输出示例
测试完成后,终端会输出本次测试的主要配置、执行时间、结果矩阵和延迟矩阵。以下为一次纯写入测试的截断输出:
```Plain Text
----------------------Main Configurations----------------------
BENCHMARK_WORK_MODE=testWithDefaultPath
DB_SWITCH=IoTDB-200-SESSION_BY_TABLET
HOST=[127.0.0.1]
GROUP_NUMBER=10
DEVICE_NUMBER=50
SENSOR_NUMBER=500
SCHEMA_CLIENT_NUMBER=20
DATA_CLIENT_NUMBER=20
OPERATION_PROPORTION=1:0:0:0:0:0:0:0:0:0:0:0:0
LOOP=10000
BATCH_SIZE_PER_WRITE=100
---------------------------------------------------------------
Create schema cost 0.30 second
Test elapsed time (not include schema creation): 1238.79 second
----------------------------------------------------------Result Matrix----------------------------------------------------------
Operation okOperation okPoint failOperation failPoint throughput(point/s)
INGESTION 500000 25000000000 0 0 20180954.09
---------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------Latency (ms) Matrix----------------------------------------------------
Operation AVG MIN P10 P25 MEDIAN P75 P90 P95 P99 P999 MAX SLOWEST_THREAD
INGESTION 37.78 1.67 2.02 2.29 2.86 4.14 5.62 7.43 759.69 5799.89 8309.40 1227561.44
---------------------------------------------------------------------------------------------------------------------------------
```
从该输出可以得到:
- 元数据创建耗时为 `0.30` 秒,正式测试耗时为 `1238.79` 秒。
- 共成功执行 `500000` 次写入操作,写入 `25000000000` 个数据点。
- `failOperation` 和 `failPoint` 均为 `0`,表示该轮测试没有记录到写入失败。
- 写入吞吐为 `20180954.09` 点/秒。
- 平均延迟为 `37.78` ms,P95 延迟为 `7.43` ms,P99 延迟为 `759.69` ms,最大延迟为 `8309.40` ms。
- `SLOWEST_THREAD` 是最慢客户端线程的累计操作时间,不是单次请求延迟。
示例中的数值仅用于展示输出格式。实际结果取决于硬件资源、网络环境、IoTDB 配置、数据规模和测试参数。
## 3\. 主要参数
### 3\.1 IoTDB 服务模型
IoTDB 2\.0\.x 支持树模型和表模型,通过以下参数选择:
```Properties
IoTDB_DIALECT_MODE=tree
```
或:
```Properties
IoTDB_DIALECT_MODE=table
```
相关约束如下:
- 一个 IoTDB 实例在一次测试中只能选择一种 SQL 方言。
- 树模型要求 `DEVICE_NUMBER >= GROUP_NUMBER`。
- 表模型要求设备数是表数的整数倍,表数是数据库数的整数倍。
- 表模型下,数据客户端数应为表数的整数倍。
常用模型参数:
|参数|示例|说明|
|---|---|---|
|`IoTDB_DIALECT_MODE`|`tree`|`tree` 或 `table`|
|`GROUP_NUMBER`|`1`|数据库数量;树模型下对应 database 数量|
|`IoTDB_TABLE_NUMBER`|`1`|表模型下创建的表数量|
|`IoTDB_TABLE_NAME_PREFIX`|`table_`|表名称前缀|
|`TABLE_TIME_COLUMN`|`time`|表模型时间列名称|
|`IoTDB_TABLE_WRITABLE_VIEW`|`false`|是否创建并使用可写视图|
### 3\.2 工作模式
通过 `BENCHMARK_WORK_MODE` 选择工作模式。
|模式|配置值|说明|
|---|---|---|
|常规测试模式|`testWithDefaultPath`|执行写入、查询或混合负载|
|生成数据模式|`generateDataMode`|将 Benchmark 生成的数据集保存到 `FILE_PATH`|
|正确性写入模式|`verificationWriteMode`|从 `FILE_PATH` 加载数据集并写入数据库|
|正确性查询模式|`verificationQueryMode`|加载数据集并与数据库查询结果进行比对|
示例:
```Properties
BENCHMARK_WORK_MODE=testWithDefaultPath
```
使用正确性写入和查询模式前,应先通过 `generateDataMode` 生成可复用数据集。
### 3\.3 服务器连接信息
|参数|示例|说明|
|---|---|---|
|`DB_SWITCH`|`IoTDB-200-SESSION_BY_TABLET`|数据库版本和连接方式|
|`HOST`|`127.0.0.1`|IoTDB 地址;多个地址使用英文逗号分隔|
|`PORT`|`6667`|原生服务端口,数量应与 `HOST` 一致|
|`USERNAME`|`root`|用户名|
|`PASSWORD`|`root`|密码|
|`DB_NAME`|`test`|测试使用的数据库名称|
|`REST_PORT`|`18080`|REST 服务端口|
|`REST_AUTHORIZATION`|`Basic cm9vdDpyb290`|REST 授权头|
|`ENABLE_AUTO_FETCH`|`false`|Session 是否自动刷新 DataNode 列表|
清理数据相关参数:
```Properties
IS_DELETE_DATA=false
INIT_WAIT_TIME=1000
```
> 警告:`IS_DELETE_DATA=true` 会在测试开始前清理目标数据库中的测试数据。仅可在专用测试环境中启用,并在执行前确认 `HOST`、`PORT`、`DB_NAME` 和账号权限。
>
>
### 3\.4 写入场景
1. 数据规模和客户端
|参数|示例|说明|
|---|---|---|
|`DEVICE_NUMBER`|`100`|设备总数|
|`SENSOR_NUMBER`|`10`|每个设备的测点数;表模型下为测点列数量|
|`GROUP_NUMBER`|`1`|IoTDB database 数量|
|`SCHEMA_CLIENT_NUMBER`|`5`|注册元数据的客户端数|
|`DATA_CLIENT_NUMBER`|`10`|执行数据读写的客户端数|
|`IS_CLIENT_BIND`|`true`|是否将设备绑定到客户端|
|`REAL_INSERT_RATE`|`1.0`|实际参与写入的设备比例|
|`IS_SENSOR_TS_ALIGNMENT`|`true`|同一设备下测点时间戳是否对齐|
2. 批量写入
|参数|示例|说明|
|---|---|---|
|`BATCH_SIZE_PER_WRITE`|`100`|每批每个设备写入的数据行数|
|`DEVICE_NUM_PER_WRITE`|`1`|每批写入涉及的设备数|
|`CREATE_SCHEMA`|`true`|写入前是否创建元数据|
|`START_TIME`|`2022-01-01T00:00:00+08:00`|生成数据的起始时间|
单个批次的数据点数为:
```Plain Text
DEVICE_NUM_PER_WRITE × SENSOR_NUMBER × BATCH_SIZE_PER_WRITE
```
`DEVICE_NUM_PER_WRITE` 必须能够整除单个数据客户端所负责的设备数。表模型下还应满足设备数、表数和单批设备数之间的整除约束。
3. 写入节奏
|参数|示例|说明|
|---|---|---|
|`POINT_STEP`|`5000`|相邻生成时间戳的固定间隔|
|`OP_MIN_INTERVAL`|`0`|每个 loop 的最小执行间隔,单位 ms|
|`OP_MIN_INTERVAL_RANDOM`|`false`|是否在 `[0, OP_MIN_INTERVAL)` 中随机选择间隔|
|`INTERVAL_BETWEEN_WRITE_BATCH`|`0`|同一 loop 内相邻 batch 的最小间隔,单位 ms|
|`TIMESTAMP_PRECISION`|`ms`|时间戳精度|
`OP_MIN_INTERVAL` 的特殊值:
- `0`:不限制 loop 间隔。
- `-1`:使用 `POINT_STEP` 作为最小间隔。
- 正整数:如果当前 loop 耗时不足该值,则等待剩余时间。
4. 乱序写入
```Properties
IS_OUT_OF_ORDER=false
OUT_OF_ORDER_MODE=POISSON
OUT_OF_ORDER_RATIO=0.5
IS_REGULAR_FREQUENCY=true
```
支持的乱序模式包括:
- `POISSON`:按照泊松分布生成乱序时间戳。
- `BATCH`:按批次生成乱序数据。
5. 数据类型
```Properties
INSERT_DATATYPE_PROPORTION=1:1:1:1:1:1:0:0:0:0:0
```
各项顺序为:
```Plain Text
BOOLEAN:INT32:INT64:FLOAT:DOUBLE:TEXT:STRING:BLOB:TIMESTAMP:DATE:OBJECT
```
各项数值表示相应数据类型的比例。
### 3\.5 查询场景
|参数|示例|说明|
|---|---|---|
|`QUERY_DEVICE_NUM`|`1`|每条查询涉及的设备数|
|`QUERY_SENSOR_NUM`|`1`|每条查询涉及的测点数|
|`QUERY_AGGREGATE_FUN`|`count`|聚合函数|
|`STEP_SIZE`|`0`|查询起始时间的变化步长,单位为 `POINT_STEP`|
|`QUERY_INTERVAL`|`250000`|查询起止时间间隔|
|`QUERY_LOWER_VALUE`|`-5`|值过滤条件下限|
|`GROUP_BY_TIME_UNIT`|`20000`|Group By 窗口大小|
|`QUERY_SET_OP_TYPE`|`union`|集合操作类型|
|`QUERY_SET_OP_NUM`|`2`|集合查询的子集合数量,至少为 2|
|`IS_RECENT_QUERY`|`false`|混合场景下是否优先查询最近写入的数据|
|`ENABLE_FIXED_QUERY`|`false`|是否让所有查询线程使用相同设备和测点组合|
|`RESULT_ROW_LIMIT`|`-1`|查询结果行数限制;`-1` 表示不使用限制|
|`ALIGN_BY_DEVICE`|`false`|是否使用 Align By Device|
### 3\.6 操作比例
`OPERATION_PROPORTION` 用于定义写入和各类查询的比例,共包含 13 项:
```Plain Text
写入:Q1:Q2:Q3:Q4:Q5:Q6:Q7:Q8:Q9:Q10:Q11:Q12
```
例如,纯写入:
```Properties
OPERATION_PROPORTION=1:0:0:0:0:0:0:0:0:0:0:0:0
```
纯精确点查询:
```Properties
OPERATION_PROPORTION=0:1:0:0:0:0:0:0:0:0:0:0:0
```
操作类型如下。
|编号|操作类型|说明|
|---|---|---|
|写入|数据写入|按当前写入配置生成并写入数据|
|Q1|精确点查询|按时间戳和设备查询指定测点|
|Q2|时间范围查询|只限制起止时间的范围查询|
|Q3|带值过滤的范围查询|同时包含时间和值过滤条件|
|Q4|带时间过滤的聚合查询|在时间范围内执行聚合|
|Q5|带值过滤的聚合查询|在全时间范围内按值过滤并聚合|
|Q6|带时间和值过滤的聚合查询|同时包含时间和值过滤条件|
|Q7|时间分组聚合查询|Group By 查询|
|Q8|最近点查询|查询设备的最新数据点|
|Q9|倒序时间范围查询|按时间倒序返回范围查询结果|
|Q10|倒序带值过滤的范围查询|带值过滤并按时间倒序返回|
|Q11|倒序时间分组聚合查询|倒序 Group By 查询|
|Q12|集合操作查询|`union`、`intersect` 或 `except` 等集合操作|
Q12 仅支持 IoTDB 2\.0 表模型。集合操作中的各子查询为范围查询。
### 3\.7 测试过程和结果持久化
```Properties
TEST_DATA_PERSISTENCE=None
```
支持的取值包括:
- `None`:不将测试过程写入外部持久化介质。
- `CSV`:写入 CSV 文件。
- `MySQL`:写入 MySQL。
- `IoTDB`:写入指定的 IoTDB。
常用参数:
|参数|示例|说明|
|---|---|---|
|`TEST_DATA_PERSISTENCE`|`None`|持久化方式|
|`RECORD_SPLIT`|`true`|是否将结果拆分为多条记录|
|`RECORD_SPLIT_MAX_LINE`|`10000000`|单表或单文件的最大记录数|
|`TEST_DATA_STORE_IP`|`127.0.0.1`|结果数据库地址|
|`TEST_DATA_STORE_PORT`|`6667`|结果数据库端口|
|`TEST_DATA_STORE_DB`|`result`|结果数据库名称|
|`TEST_DATA_STORE_USER`|`root`|结果数据库用户名|
|`TEST_DATA_STORE_PW`|`root`|结果数据库密码|
|`REMARK`|`write_test`|测试备注,可用于区分不同测试|
|`CSV_OUTPUT`|`true`|是否将最终结果写入 CSV|
设置为 CSV 时,运行后会在 `data` 目录下生成相关记录;其中测试结果通常位于 `data/csvOutput`。无论是否开启持久化,测试日志均写入 `logs`。
日志输出频率可通过以下参数控制:
```Properties
IS_QUIET_MODE=true
LOG_PRINT_INTERVAL=5
RESULT_PRINT_INTERVAL=3600
```
### 3\.8 自动化和集群测试
1. 限制测试时长
```Properties
TEST_MAX_TIME=3600000
```
单位为毫秒。设置为 `0` 表示不限制。该参数不包含预注册元数据所消耗的时间。
2. 多 Benchmark 集群压测
在多台客户端机器上使用相同的总体数据规模配置,并设置:
```Properties
BENCHMARK_CLUSTER=true
BENCHMARK_INDEX=0
```
每个 Benchmark 实例必须使用不同的 `BENCHMARK_INDEX`,例如依次使用 `0`、`1`、`2`。所有客户端应保持数据库连接、数据规模和操作比例等配置一致。
3. 双写测试
IoT Benchmark 支持将同一份数据写入两个不同的数据库进行对比:
```Properties
IS_DOUBLE_WRITE=true
ANOTHER_DB_SWITCH=<另一数据库类型>
ANOTHER_HOST=127.0.0.1
ANOTHER_PORT=6667
ANOTHER_USERNAME=root
ANOTHER_PASSWORD=root
ANOTHER_DB_NAME=test
```
双写模式不支持同一数据库不同版本之间的比较,也不支持 IoTDB 树模型与表模型之间的直接比较。
## 4\. 使用示例
本节使用小规模数据演示基本流程。正式性能测试应根据目标业务模型扩大设备数、测点数、客户端数和循环次数,并进行多轮预热和重复测试。
### 4\.1 写入测试示例
测试目标:使用 10 个数据客户端,模拟 100 台设备,每台设备包含 10 个测点,执行纯写入测试。
配置示例:
```Properties
# 数据库连接
DB_SWITCH=IoTDB-200-SESSION_BY_TABLET
IoTDB_DIALECT_MODE=tree
HOST=127.0.0.1
PORT=6667
USERNAME=root
PASSWORD=root
DB_NAME=test
# 安全设置:默认不自动删除已有数据
IS_DELETE_DATA=false
# 工作模式
BENCHMARK_WORK_MODE=testWithDefaultPath
OPERATION_PROPORTION=1:0:0:0:0:0:0:0:0:0:0:0:0
# 数据规模
GROUP_NUMBER=1
DEVICE_NUMBER=100
SENSOR_NUMBER=10
SCHEMA_CLIENT_NUMBER=5
DATA_CLIENT_NUMBER=10
IS_SENSOR_TS_ALIGNMENT=true
# 写入配置
CREATE_SCHEMA=true
BATCH_SIZE_PER_WRITE=10
DEVICE_NUM_PER_WRITE=1
LOOP=100
POINT_STEP=1000
OP_MIN_INTERVAL=0
START_TIME=2026-01-01T00:00:00+08:00
INSERT_DATATYPE_PROPORTION=1:1:1:1:1:1:0:0:0:0:0
# IoTDB 2.0.6 及以上版本可开启
ENABLE_IOTDB_RPC_COMPRESSION=true
# 输出
TEST_DATA_PERSISTENCE=None
CSV_OUTPUT=true
REMARK=iotdb_2_write_test
```
启动测试:
```Bash
./benchmark.sh
```
完成后重点查看:
- `INGESTION` 的 `okPoint` 和 `failPoint`。
- 吞吐量 `throughput`。
- `AVG`、`P95`、`P99`、`MAX` 延迟。
- 是否存在连接超时、写入失败或服务端异常日志。
### 4\.2 查询测试示例
执行查询测试前,应确保目标数据库中已经存在与查询配置匹配的数据。建议复用写入测试生成的数据,并关闭自动删数和元数据创建。
以下示例同时执行多种查询:
```Properties
DB_SWITCH=IoTDB-200-SESSION_BY_TABLET
IoTDB_DIALECT_MODE=tree
HOST=127.0.0.1
PORT=6667
USERNAME=root
PASSWORD=root
DB_NAME=test
IS_DELETE_DATA=false
CREATE_SCHEMA=false
BENCHMARK_WORK_MODE=testWithDefaultPath
GROUP_NUMBER=1
DEVICE_NUMBER=100
SENSOR_NUMBER=10
SCHEMA_CLIENT_NUMBER=1
DATA_CLIENT_NUMBER=10
# 不执行写入,Q1~Q11 各占相同比例;树模型不使用 Q12
OPERATION_PROPORTION=0:1:1:1:1:1:1:1:1:1:1:1:0
LOOP=100
QUERY_DEVICE_NUM=2
QUERY_SENSOR_NUM=2
QUERY_AGGREGATE_FUN=count
STEP_SIZE=1
QUERY_INTERVAL=250000
QUERY_LOWER_VALUE=-5
GROUP_BY_TIME_UNIT=20000
```
如果测试表模型集合查询,可将方言切换为 `table`,并为 Q12 设置比例:
```Properties
IoTDB_DIALECT_MODE=table
OPERATION_PROPORTION=0:0:0:0:0:0:0:0:0:0:0:0:1
QUERY_SET_OP_TYPE=union
QUERY_SET_OP_NUM=2
```
### 4\.3 其他配置示例
1. 模拟真实写入速率
让每个 loop 的最小间隔与数据时间戳间隔一致:
```Properties
POINT_STEP=1000
OP_MIN_INTERVAL=-1
```
如果希望写入请求在一个 loop 内均匀分布,可使用:
```Properties
INTERVAL_BETWEEN_WRITE_BATCH=100
```
2. 指定测试时长
测试 1 小时:
```Properties
TEST_MAX_TIME=3600000
```
应确保 `LOOP` 足够大,否则测试可能先因循环次数耗尽而结束。
3. 控制生成数据规律
```Properties
LINE_RATIO=1
SIN_RATIO=1
SQUARE_RATIO=1
RANDOM_RATIO=1
CONSTANT_RATIO=1
DATA_SEED=666
STRING_LENGTH=10
DOUBLE_LENGTH=2
```
固定 `DATA_SEED` 有助于在多轮测试中生成可重复的数据。
## 5\. 参考资料
- [IoT Benchmark 文档](https://github.com/thulab/iot-benchmark/tree/master/docs)