# 基于 IoT-benchmark 的时序数据库性能测试实战:从安装到结果分析
在物联网场景下,时序数据库的性能直接关系到业务系统的响应速度和成本控制。面对众多数据库选型,如何用客观数据指导决策?IoT-benchmark作为清华大学软件学院开源的性能测试工具,提供了标准化的测试方案。本文从零开始,完整演示基于IoT-benchmark的时序数据库性能测试全流程。
## IoT-benchmark 项目概述
IoT-benchmark是一款基于Java开发的时序数据库基准测试工具,专门针对工业物联网场景设计。它采用模块化架构,将工作负载生成、性能指标测量和数据库接口三个核心组件解耦,参考了YCSB测试工具的设计理念。
相比其他测试工具,IoT-benchmark的特色在于:支持多种写入和查询方式,包括批量写入和乱序数据写入模式;集成了系统监控模块,可同时记录测试数据和系统资源使用情况;支持与Tableau集成,实现测试结果可视化。
目前该工具支持的主流时序数据库包括:IoTDB(v1.x/v2.x)、InfluxDB(v1.x/v2.x)、TimescaleDB、TDengine(v2.2.0.2+)、OpenTSDB、QuestDB等。
## 环境准备与安装
### 前置条件
- Java 8 或更高版本
- Maven 3.6+
- Git客户端
- 目标测试数据库已安装运行(以IoTDB 2.0为例)
### 获取项目
```bash
# 克隆项目代码
git clone https://github.com/thulab/iot-benchmark.git
cd iot-benchmark
```
### 编译安装(以IoTDB 2.0测试为例)
```bash
# 第一步:编译IoTDB Session包
# 下载IoTDB 2.0源码
git clone https://github.com/apache/iotdb/tree/rc/2.0.5
cd iotdb
mvn clean package install -pl session -am -DskipTests
cd ..
# 第二步:编译IoT-benchmark测试包
cd iot-benchmark
mvn clean package install -pl iotdb-2.0 -am -DskipTests
```
编译完成后,测试包位于`./iotdb-2.0/target/iotdb-2.0-0.0.1/iotdb-2.0-0.0.1`。
## 测试包结构与配置
### 目录结构
解压测试包后,主要目录如下:
```
iotdb-2.0-0.0.1/
├── benchmark.sh # Linux/Mac启动脚本
├── benchmark.bat # Windows启动脚本
├── conf/ # 配置文件目录
│ └── config.properties # 核心配置文件
├── bin/ # 初始化脚本目录
│ └── startup.sh # 初始化脚本
├── lib/ # 依赖库
├── logs/ # 测试日志输出
└── data/ # 测试结果存储
└── csvOutput/ # CSV格式测试结果
```
### 核心配置参数
`conf/config.properties`是测试的关键配置文件,主要参数说明如下:
```properties
# 1. 被测数据库配置
DB_SWITCH=IoTDB-200-SESSION_BY_TABLET # 数据库类型及连接方式
HOST=127.0.0.1 # 数据库地址
PORT=6667 # 数据库端口
USERNAME=root # 用户名
PASSWORD=root # 密码
DB_NAME=test # 数据库名
<"5m.s6k3.org.cn"><"9z.s6k3.org.cn"><"2h.s6k3.org.cn">
# 2. 工作模式配置
BENCHMARK_WORK_MODE=testWithDefaultPath # 常规测试模式
# 其他可选模式:
# generateDataMode - 生成模拟数据集
# verificationWriteMode - 正确性写入验证
# verificationQueryMode - 正确性查询验证
# serverMODE - 服务器监控模式
# 3. 写入场景参数
CLIENT_NUMBER=10 # 并发客户端数
GROUP_NUMBER=20 # 存储组数量(仅IoTDB)
DEVICE_NUMBER=100 # 设备总数
SENSOR_NUMBER=300 # 每设备传感器数
BATCH_SIZE_PER_WRITE=100 # 每批写入数据行数
POINT_STEP=1000 # 数据点时间间隔(ms)
LOOP=86400 # 总操作次数
# 4. 操作比例配置(纯写入示例)
OPERATION_PROPORTION=1:0:0:0:0:0:0:0:0:0:0
# 格式:写:Q1:Q2:Q3:Q4:Q5:Q6:Q7:Q8:Q9:Q10
# 5. 数据类型比例
INSERT_DATATYPE_PROPORTION=1:1:1:1:1:1:0:0:0:0
# BOOLEAN:INT32:INT64:FLOAT:DOUBLE:TEXT:STRING:BLOB:TIMESTAMP:DATE
```
### 测试场景示例
根据上述配置,测试场景可描述为:10个并发客户端,向被测数据库写入100台设备×300个传感器的时序数据,数据时间间隔1秒,总操作次数86400次,预计生成约25.9亿个数据点。
## 执行测试
### 启动被测数据库
确保目标时序数据库已正常运行。以IoTDB为例:
```bash
# 启动IoTDB
start-iotdb.sh
```
### 执行测试
```bash
# Linux/Mac环境
./benchmark.sh
# Windows环境
benchmark.bat
```
测试过程中,控制台会实时显示写入速率、操作延迟等指标。如需服务器资源监控模式,可使用专用脚本:
```bash
./ser-benchmark.sh
```
## 测试结果分析
测试完成后,结果保存在`data/csvOutput`目录下,日志文件位于`logs`文件夹。
### 结果矩阵解读
典型的测试输出包含以下指标:
| 指标类别 | 指标名称 | 说明 |
|---------|---------|------|
| **操作结果** | OkOperation | 成功操作次数 |
| | OkPoint | 成功写入/查询的数据点数 |
| | FailOperation | 失败操作次数 |
| | FailPoint | 失败数据点数 |
| **延迟分布(ms)** | AVG | 平均操作延迟 |
| | MIN | 最小操作延迟 |
| | P25/P50/P75/P90/P95/P99 | 百分位延迟值 |
### 性能评估维度
基于测试结果,可从以下维度评估数据库性能:
1. **写入吞吐量**:每秒写入数据点数(points/sec),由`OkPoint / 总测试时间`计算得出
2. **查询延迟**:各类查询操作的P99延迟,反映系统在高负载下的响应能力
3. **资源消耗**:CPU、内存、磁盘I/O使用情况(需serverMODE采集)
4. **存储压缩比**:原始数据大小与数据库实际占用空间之比
### 实际案例分析
在TSBS(Time Series Benchmark Suite)的IoT场景测试中,不同数据库表现差异明显:
<"x7.s6k3.org.cn"><"b3.s6k3.org.cn"><"r9.s6k3.org.cn">
- **写入性能**:在同等硬件条件下,TDengine的写入吞吐量可达TimescaleDB的1.04~3.3倍,是InfluxDB的1.82~16.2倍
- **存储效率**:TimescaleDB的存储空间占用可达TDengine的11.6倍(大数据量场景)
- **查询响应**:复杂聚合查询中,TDengine的响应速度是TimescaleDB的5.1~23.3倍,是InfluxDB的21.2~68.7倍
这些数据表明,时序数据库的性能差异在规模效应下会被显著放大,选型时需结合实际业务规模进行评估。
## 高级用法
### 生成模拟数据集
如需保留测试数据集供后续验证,可使用数据生成模式:
```properties
BENCHMARK_WORK_MODE=generateDataMode
FILE_PATH=data/test # 数据集保存路径
BIG_BATCH_SIZE=100 # 每文件包含的batch数
```
执行后生成的数据集包含:`info.txt`(配置信息)、`schema.txt`(元数据)、以及多个CSV数据文件。
### 正确性验证模式
对于需要验证数据写入准确性的场景,可分两步进行:
```properties
# 第一步:写入验证
BENCHMARK_WORK_MODE=verificationWriteMode
FILE_PATH=data/test
# 第二步:查询验证
BENCHMARK_WORK_MODE=verificationQueryMode
FILE_PATH=data/test
```
## 总结与建议
IoT-benchmark提供了一套标准化的时序数据库性能评估体系,从安装部署到结果分析均有完善支持。基于测试数据做选型决策时,建议关注以下几点:
1. **匹配业务场景**:根据实际数据规模、写入频率、查询模式调整测试参数,避免“万 能测试”脱离实际
2. **关注极端值**:P99延迟比平均延迟更能反映系统稳定性
3. **综合成本考量**:存储效率直接影响硬件投入,高压缩比的数据库长期运行成本更低
4. **持续验证**:业务发展后重新测试,确保数据库能力与需求同步增长
掌握IoT-benchmark的使用方法,意味着拥有了时序数据库选型的客观标尺。在数据驱动的决策时代,让测试数据说话,比任何宣传都更有说服力。