测试工具

IoT Benchmark 是面向工业物联网(IIoT)场景的时序数据库、实时数据库基准测试工具。本手册介绍工具的主要能力、支持的数据库及基本使用方法;安装、配置和测试案例主要以 IoTDB 2.0.x 为例,并同时覆盖树模型和表模型。

1. 基本概述

IoT Benchmark 可以按照配置生成周期性时间序列数据,对数据库执行写入和查询,并统计吞吐、延迟及成功率等指标。主要能力包括:

  • 跨平台运行:支持 Linux、macOS 和 Windows。

  • 多种负载:支持纯写入、纯查询及读写混合负载。

  • 数据集生成:可将生成的数据保存到磁盘,供重复测试使用。

  • 正确性验证:可从磁盘加载数据集,执行写入和查询正确性验证。

  • 多数据库支持:可对多种时序数据库和实时数据库执行测试;IoTDB 2.0.x 支持 JDBC、REST 和多种 Session 写入方式。

  • 结果持久化:支持将测试过程和结果保存到文件、CSV、MySQL 或 IoTDB。

  • 测试扩展:支持乱序写入、批量写入、集群压测、双写对比和结果可视化等场景。

1.1 支持的数据库、版本和接入方式

IoT Benchmark 支持如下数据库和版本。测试时通过 DB_SWITCH 选择对应的数据库、版本及连接或写入方式。

数据库支持版本DB_SWITCH
IoTDBv1.xIoTDB-130-JDBC、IoTDB-130-REST、IoTDB-130-SESSION_BY_TABLET、IoTDB-130-SESSION_BY_RECORD、IoTDB-130-SESSION_BY_RECORDS
IoTDBv2.xIoTDB-200-JDBC、IoTDB-200-REST、IoTDB-200-SESSION_BY_TABLET、IoTDB-200-SESSION_BY_RECORD、IoTDB-200-SESSION_BY_RECORDS
InfluxDBv1.xInfluxDB
InfluxDBv2.xInfluxDB-2.x
QuestDBv6.0.7QuestDB
Microsoft SQL Server2016 SP2MSSQLSERVER
VictoriaMetricsv1.64.0VictoriaMetrics
SQLite—SQLite
OpenTSDB2.4.1OpenTSDB
KairosDB—KairosDB
TimescaleDB—TimescaleDB
TimescaleDB ClusterClusterTimescaleDB-Cluster
TDengine2.2.0.2TDengine
TDengine3.0.1TDengine-3
DolphinDBv2.xDolphinDB-2-MTW、DolphinDB-2-PTA
DolphinDBv3.xDolphinDB-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说明
JDBCIoTDB-200-JDBC通过 JDBC 执行写入和查询
RESTIoTDB-200-REST通过 IoTDB REST 接口执行测试
Session by TabletIoTDB-200-SESSION_BY_TABLET使用 Tablet 批量写入
Session by RecordIoTDB-200-SESSION_BY_RECORD逐条写入记录
Session by RecordsIoTDB-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 下载与测试目标匹配的发行包,解压后使用。

  1. 从源码构建

克隆仓库:

git clone https://github.com/thulab/iot-benchmark.git
cd iot-benchmark

在项目根目录执行:

mvn clean package -Dmaven.test.skip=true

构建完成后,IoTDB 2.0.x 安装包位于:

iotdb-2.0/target/iot-benchmark-iotdb-2.0/iot-benchmark-iotdb-2.0

进入安装目录:

cd iotdb-2.0/target/iot-benchmark-iotdb-2.0/iot-benchmark-iotdb-2.0

2.3 测试包结构

安装包中的常用文件和目录如下。

名称用途
benchmark.shLinux、macOS 启动脚本
benchmark.batWindows 启动脚本
conf/config.properties测试场景配置文件
lib/运行依赖库
logs/测试日志,首次运行后生成
data/数据集或持久化结果目录,按工作模式和持久化配置生成

2.4 执行测试

  1. 启动 IoTDB

首先启动目标 IoTDB 2.0.x,并确认客户端能够访问其服务端口。默认原生接口端口为 6667。

  1. 修改配置
  • 编辑 conf/config.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
  • 使用表模型时改为:
IoTDB_DIALECT_MODE=table
  • 如果选择 REST:
DB_SWITCH=IoTDB-200-REST
REST_PORT=18080
REST_AUTHORIZATION=Basic cm9vdDpyb290

REST_AUTHORIZATION 用于配置 REST 接口的 Basic Authentication 信息。示例使用用户名 root、密码 root。

  1. 检查 RPC 压缩兼容性

IoT Benchmark 2.0 默认开启 IoTDB RPC 压缩:

ENABLE_IOTDB_RPC_COMPRESSION=true

该功能要求被测 IoTDB 版本为 2.0.6 或更高版本。如果测试 2.0.6 之前的 IoTDB 2.0.x,请设置:

ENABLE_IOTDB_RPC_COMPRESSION=false

Thrift 压缩是另一项独立配置。如果启用:

ENABLE_THRIFT_COMPRESSION=true

还需要在 IoTDB 的 iotdb-datanode.properties 中设置:

dn_rpc_thrift_compression_enable=true
  1. 启动 Benchmark

Linux 或 macOS:

./benchmark.sh

Windows:

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

  1. 延迟矩阵

延迟矩阵以毫秒为单位,常见字段如下:

指标说明
AVG平均延迟
MIN最小延迟
P10、P25、MEDIAN低分位和中位延迟
P75、P90、P95较高分位延迟
P99、P999尾延迟
MAX最大延迟
SLOWEST_THREAD客户端线程中最大的累计操作时间

测试结果还会给出元数据创建耗时和不包含元数据创建的 Test elapsed time。对比测试时,应确保各轮测试的硬件、数据量、客户端数、压缩配置和缓存状态一致。

  1. 输出示例

测试完成后,终端会输出本次测试的主要配置、执行时间、结果矩阵和延迟矩阵。以下为一次纯写入测试的截断输出:

----------------------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 支持树模型和表模型,通过以下参数选择:

IoTDB_DIALECT_MODE=tree

或:

IoTDB_DIALECT_MODE=table

相关约束如下:

  • 一个 IoTDB 实例在一次测试中只能选择一种 SQL 方言。

  • 树模型要求 DEVICE_NUMBER >= GROUP_NUMBER。

  • 表模型要求设备数是表数的整数倍,表数是数据库数的整数倍。

  • 表模型下,数据客户端数应为表数的整数倍。

常用模型参数:

参数示例说明
IoTDB_DIALECT_MODEtreetree 或 table
GROUP_NUMBER1数据库数量;树模型下对应 database 数量
IoTDB_TABLE_NUMBER1表模型下创建的表数量
IoTDB_TABLE_NAME_PREFIXtable_表名称前缀
TABLE_TIME_COLUMNtime表模型时间列名称
IoTDB_TABLE_WRITABLE_VIEWfalse是否创建并使用可写视图

3.2 工作模式

通过 BENCHMARK_WORK_MODE 选择工作模式。

模式配置值说明
常规测试模式testWithDefaultPath执行写入、查询或混合负载
生成数据模式generateDataMode将 Benchmark 生成的数据集保存到 FILE_PATH
正确性写入模式verificationWriteMode从 FILE_PATH 加载数据集并写入数据库
正确性查询模式verificationQueryMode加载数据集并与数据库查询结果进行比对

示例:

BENCHMARK_WORK_MODE=testWithDefaultPath

使用正确性写入和查询模式前,应先通过 generateDataMode 生成可复用数据集。

3.3 服务器连接信息

参数示例说明
DB_SWITCHIoTDB-200-SESSION_BY_TABLET数据库版本和连接方式
HOST127.0.0.1IoTDB 地址;多个地址使用英文逗号分隔
PORT6667原生服务端口,数量应与 HOST 一致
USERNAMEroot用户名
PASSWORDroot密码
DB_NAMEtest测试使用的数据库名称
REST_PORT18080REST 服务端口
REST_AUTHORIZATIONBasic cm9vdDpyb290REST 授权头
ENABLE_AUTO_FETCHfalseSession 是否自动刷新 DataNode 列表

清理数据相关参数:

IS_DELETE_DATA=false
INIT_WAIT_TIME=1000

警告:IS_DELETE_DATA=true 会在测试开始前清理目标数据库中的测试数据。仅可在专用测试环境中启用,并在执行前确认 HOST、PORT、DB_NAME 和账号权限。

3.4 写入场景

  1. 数据规模和客户端
参数示例说明
DEVICE_NUMBER100设备总数
SENSOR_NUMBER10每个设备的测点数;表模型下为测点列数量
GROUP_NUMBER1IoTDB database 数量
SCHEMA_CLIENT_NUMBER5注册元数据的客户端数
DATA_CLIENT_NUMBER10执行数据读写的客户端数
IS_CLIENT_BINDtrue是否将设备绑定到客户端
REAL_INSERT_RATE1.0实际参与写入的设备比例
IS_SENSOR_TS_ALIGNMENTtrue同一设备下测点时间戳是否对齐
  1. 批量写入
参数示例说明
BATCH_SIZE_PER_WRITE100每批每个设备写入的数据行数
DEVICE_NUM_PER_WRITE1每批写入涉及的设备数
CREATE_SCHEMAtrue写入前是否创建元数据
START_TIME2022-01-01T00:00:00+08:00生成数据的起始时间

单个批次的数据点数为:

DEVICE_NUM_PER_WRITE × SENSOR_NUMBER × BATCH_SIZE_PER_WRITE

DEVICE_NUM_PER_WRITE 必须能够整除单个数据客户端所负责的设备数。表模型下还应满足设备数、表数和单批设备数之间的整除约束。

  1. 写入节奏
参数示例说明
POINT_STEP5000相邻生成时间戳的固定间隔
OP_MIN_INTERVAL0每个 loop 的最小执行间隔,单位 ms
OP_MIN_INTERVAL_RANDOMfalse是否在 [0, OP_MIN_INTERVAL) 中随机选择间隔
INTERVAL_BETWEEN_WRITE_BATCH0同一 loop 内相邻 batch 的最小间隔,单位 ms
TIMESTAMP_PRECISIONms时间戳精度

OP_MIN_INTERVAL 的特殊值:

  • 0:不限制 loop 间隔。

  • -1:使用 POINT_STEP 作为最小间隔。

  • 正整数:如果当前 loop 耗时不足该值,则等待剩余时间。

  1. 乱序写入
IS_OUT_OF_ORDER=false
OUT_OF_ORDER_MODE=POISSON
OUT_OF_ORDER_RATIO=0.5
IS_REGULAR_FREQUENCY=true

支持的乱序模式包括:

  • POISSON:按照泊松分布生成乱序时间戳。

  • BATCH:按批次生成乱序数据。

  1. 数据类型
INSERT_DATATYPE_PROPORTION=1:1:1:1:1:1:0:0:0:0:0

各项顺序为:

BOOLEAN:INT32:INT64:FLOAT:DOUBLE:TEXT:STRING:BLOB:TIMESTAMP:DATE:OBJECT

各项数值表示相应数据类型的比例。

3.5 查询场景

参数示例说明
QUERY_DEVICE_NUM1每条查询涉及的设备数
QUERY_SENSOR_NUM1每条查询涉及的测点数
QUERY_AGGREGATE_FUNcount聚合函数
STEP_SIZE0查询起始时间的变化步长,单位为 POINT_STEP
QUERY_INTERVAL250000查询起止时间间隔
QUERY_LOWER_VALUE-5值过滤条件下限
GROUP_BY_TIME_UNIT20000Group By 窗口大小
QUERY_SET_OP_TYPEunion集合操作类型
QUERY_SET_OP_NUM2集合查询的子集合数量,至少为 2
IS_RECENT_QUERYfalse混合场景下是否优先查询最近写入的数据
ENABLE_FIXED_QUERYfalse是否让所有查询线程使用相同设备和测点组合
RESULT_ROW_LIMIT-1查询结果行数限制;-1 表示不使用限制
ALIGN_BY_DEVICEfalse是否使用 Align By Device

3.6 操作比例

OPERATION_PROPORTION 用于定义写入和各类查询的比例,共包含 13 项:

写入:Q1:Q2:Q3:Q4:Q5:Q6:Q7:Q8:Q9:Q10:Q11:Q12

例如,纯写入:

OPERATION_PROPORTION=1:0:0:0:0:0:0:0:0:0:0:0:0

纯精确点查询:

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 测试过程和结果持久化

TEST_DATA_PERSISTENCE=None

支持的取值包括:

  • None:不将测试过程写入外部持久化介质。

  • CSV:写入 CSV 文件。

  • MySQL:写入 MySQL。

  • IoTDB:写入指定的 IoTDB。

常用参数:

参数示例说明
TEST_DATA_PERSISTENCENone持久化方式
RECORD_SPLITtrue是否将结果拆分为多条记录
RECORD_SPLIT_MAX_LINE10000000单表或单文件的最大记录数
TEST_DATA_STORE_IP127.0.0.1结果数据库地址
TEST_DATA_STORE_PORT6667结果数据库端口
TEST_DATA_STORE_DBresult结果数据库名称
TEST_DATA_STORE_USERroot结果数据库用户名
TEST_DATA_STORE_PWroot结果数据库密码
REMARKwrite_test测试备注,可用于区分不同测试
CSV_OUTPUTtrue是否将最终结果写入 CSV

设置为 CSV 时,运行后会在 data 目录下生成相关记录;其中测试结果通常位于 data/csvOutput。无论是否开启持久化,测试日志均写入 logs。

日志输出频率可通过以下参数控制:

IS_QUIET_MODE=true
LOG_PRINT_INTERVAL=5
RESULT_PRINT_INTERVAL=3600

3.8 自动化和集群测试

  1. 限制测试时长
TEST_MAX_TIME=3600000

单位为毫秒。设置为 0 表示不限制。该参数不包含预注册元数据所消耗的时间。

  1. 多 Benchmark 集群压测

在多台客户端机器上使用相同的总体数据规模配置,并设置:

BENCHMARK_CLUSTER=true
BENCHMARK_INDEX=0

每个 Benchmark 实例必须使用不同的 BENCHMARK_INDEX,例如依次使用 0、1、2。所有客户端应保持数据库连接、数据规模和操作比例等配置一致。

  1. 双写测试

IoT Benchmark 支持将同一份数据写入两个不同的数据库进行对比:

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 个测点,执行纯写入测试。

配置示例:

# 数据库连接
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

启动测试:

./benchmark.sh

完成后重点查看:

  • INGESTION 的 okPoint 和 failPoint。

  • 吞吐量 throughput。

  • AVG、P95、P99、MAX 延迟。

  • 是否存在连接超时、写入失败或服务端异常日志。

4.2 查询测试示例

执行查询测试前,应确保目标数据库中已经存在与查询配置匹配的数据。建议复用写入测试生成的数据,并关闭自动删数和元数据创建。

以下示例同时执行多种查询:

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 设置比例:

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 的最小间隔与数据时间戳间隔一致:

POINT_STEP=1000
OP_MIN_INTERVAL=-1

如果希望写入请求在一个 loop 内均匀分布,可使用:

INTERVAL_BETWEEN_WRITE_BATCH=100
  1. 指定测试时长

测试 1 小时:

TEST_MAX_TIME=3600000

应确保 LOOP 足够大,否则测试可能先因循环次数耗尽而结束。

  1. 控制生成数据规律
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. 参考资料