TDengine 压测利器 taosBenchmark 完全指南:从源码构建到写入/查询/订阅全功能压测
2026/9/15 14:20:29 网站建设 项目流程

TDengine 压测利器 taosBenchmark 完全指南:从源码构建到写入/查询/订阅全功能压测

【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine

导读

taosBenchmark(曾用名 taosdemo)是 TDengine 生态中面向写入、查询、订阅等场景的全功能压力测试工具,可用于验证数据库的写入吞吐、查询性能与订阅链路稳定性。本文基于当前仓库 tools/taosBenchmark 官方文档及源码,完整讲解该工具的编译安装、命令行参数、JSON 配置文件结构与各场景实战用法,帮助你在本机快速搭建一套可复现的 TDengine 压测环境。

一、taosBenchmark 是什么

在 TDengine 仓库中,tools/taosBenchmark/README.md 明确指出:taosTools 是 TDengine 的辅助工具集合,而taosBenchmark(曾命名为 taosdemo)可以用于对 TDengine 进行全功能的写入、查询、订阅等功能的压力测试

其版本发布方式发生过变化:

  • 在 TDengine 2.4.0.7 及之前的版本,taosBenchmark 随 taosTools 安装包一起发布;
  • 在后续版本中,taosBenchmark 被重新纳入 TDengine 标准安装包。

从仓库中 tools/taosBenchmark/VERSION 可以看到当前仓库内该工具的版本标识为taosbenchmark-3.3.1,属于 TDengine 3.x 系列配套工具。同一目录下还包含另一款工具taosdump(用于备份 TDengine 数据到本地目录、以及从本地目录恢复),但本文聚焦 taosBenchmark 的压测能力。

从源码结构看,taosBenchmark 被设计为四种测试模式,定义于 tools/taosBenchmark/inc/bench.h 的enum TEST_MODE

模式枚举值用途
INSERT_TEST0写入压测(默认)
QUERY_TEST1查询压测
SUBSCRIBE_TEST2数据订阅(TMQ)压测
CSVFILE_TEST3生成 CSV 数据文件

二、从源码构建 taosBenchmark

1. 安装依赖软件包

Ubuntu / Debian 系统
sudo apt install libjansson-dev libsnappy-dev liblzma-dev libz-dev zlib1g pkg-config libssl-dev gawk
CentOS 7 / RHEL 系统
sudo yum install -y zlib-devel zlib-static xz-devel snappy-devel jansson jansson-devel pkgconfig libatomic libatomic-static libstdc++-static openssl-devel gawk
CentOS 8 / Rocky Linux 系统
sudo yum install -y epel-release sudo yum install -y dnf-plugins-core sudo yum config-manager --set-enabled powertools sudo yum install -y zlib-devel zlib-static xz-devel snappy-devel jansson jansson-devel pkgconfig libatomic libatomic-static libstdc++-static openssl-devel gawk

已知坑点说明:由于 snappy 缺乏 pkg-config 支持,cmake 会提示libsnappy not found,但这并不影响实际编译与运行,可以放心忽略该提示。

若因 CentOS 8 停止维护(EOL)导致部分软件包无法下载,可先执行以下命令切换到 vault 镜像源:

sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
CentOS + devtoolset 系统

除上述依赖外,还需要高版本 GCC 工具链:

sudo yum install centos-release-scl sudo yum install devtoolset-9 devtoolset-9-libatomic-devel scl enable devtoolset-9 -- bash
macOS 系统(目前仅支持编译 taosBenchmark)
brew install argp-standalone gawk

2. 安装 TDengine 客户端

taosBenchmark 依赖 TDengine 客户端库(taosc),因此编译前需要先安装 TDengine 客户端包,或直接编译安装本仓库源码。安装后通过taos_get_client_info()获取客户端版本,源码在 tools/taosBenchmark/src/benchMain.c 中会据此判断客户端主版本号,从而决定按 TDengine 3.x 还是 2.x 的行为路径初始化参数(见 benchCommandOpt.c 中initArgument()taosc_version的设置)。

3. 克隆源码并编译

git clone https://github.com/taosdata/taos-tools cd taos-tools mkdir build cd build cmake .. make

如需为 TDengine 2.x 构建兼容版本,在 cmake 阶段追加版本参数:

cmake .. -DTD_VER_COMPATIBLE=2.0.0.0 make

4. 安装

sudo make install

安装完成后,即可在命令行直接调用taosBenchmark二进制。构建系统由 tools/taosBenchmark/CMakeLists.txt 组织,它先构建deps下的依赖,再构建src下的主程序,产物输出到build/bin目录。

三、命令行参数一览

不传任何参数直接运行taosBenchmark会以默认的demo 模式执行一组内置的写入测试;传入 JSON 配置文件(-f)则进入完全由文件驱动的压测流程。源码 tools/taosBenchmark/src/benchSys.c 中定义了全部命令行选项,下表汇总了常用参数:

短选项长选项说明默认值
-f--fileJSON 配置文件路径,与其余命令行选项互斥
-c--config-dir配置文件目录/etc/taos
-h--host连接的服务器 FQDNlocalhost
-P--port连接端口6030
-I--interface写入模式:taosc / rest / stmt / stmt2 / smltaosc
-u--user用户名root
-p--password密码taosdata
-o--output结果输出文件./output.txt
-j--output-json-file结果输出 JSON 文件(可选)
-T--threads写入线程数8
-i--insert-interval交错模式下每次插入的间隔(毫秒)0
-S--time-step时间戳步长(毫秒)1
-H--angle-step角度步长(毫秒)1
-s--start-timestamp起始时间戳1500000000000(2017-07-14)
-U--supplement-insert仅补充写入、不创建库表关闭
-B--interlace-rows交错写入的行数0
-r--rec-per-req单次请求记录数30000
-t--tables子表数量10000
-n--records每张子表的记录数10000
-d--database数据库名test
-l--columnsINT 类型列数量0
-L--partial-col-num前 N 列有数据,其余为 NULL全部列
-A--tag-type标签数据类型INT,BINARY(16)
-b--data-type列数据类型FLOAT,INT,FLOAT
-w--binwidthnchar/binary 未指定时的默认长度64
-m--table-prefix子表名前缀d
-E--escape-character库表名使用转义字符关闭
-C--chinesenchar/binary 生成中文数据关闭
-N--normal-table仅创建普通表、不创建超级表关闭
-M--random每个子表生成不同的随机数据(需较多内存)关闭
-x--aggr-func插入后执行聚合函数查询关闭
-y--answer-yes自动确认提示关闭
-R--disorder-range乱序时间戳范围1000
-O--disorder乱序时间戳数据比例0
-a--replica建库副本数1
-g--debug调试模式关闭
-G--performance性能模式关闭
-F--prepared_rand随机数据源大小20000
-v--vgroups指定建库 VGroup 数(仅 daemon 3.0+)
-k--keep-trying写入失败后持续重试关闭
-z--trying-interval重试间隔
-Q--nodrop不删除已存在数据库关闭
-V--version打印版本信息-
-X--dsn云服务 DSN 连接串
-Z--driver指定驱动

上述默认值多数定义于 tools/taosBenchmark/inc/bench.h(如DEFAULT_NTHREADSDEFAULT_CHILDTABLESDEFAULT_PORTDEFAULT_PREPARED_RANDDEFAULT_REQ_PER_REQ等)。

四、写入压测:JSON 配置文件详解

复杂的压测场景(多库、多超级表、多种数据类型、函数生成、乱序数据等)必须使用 JSON 配置文件驱动。配置文件通过-f传入,filetype字段声明文件类型(insert/query/subscribe/csvfile)。

1. 全局连接与并发配置

以仓库自带的 tools/taosBenchmark/example/insert.json 为例:

{ "filetype": "insert", "cfgdir": "/etc/taos", "host": "127.0.0.1", "port": 6030, "user": "root", "password": "taosdata", "thread_count": 4, "create_table_thread_count": 1, "confirm_parameter_prompt": "no", "num_of_records_per_req": 10000, "prepared_rand": 10000, "chinese": "no", "escape_character": "yes", "continue_if_fail": "no", "databases": [] }

各全局字段含义:

字段说明
filetype配置文件类型,此处为insert
cfgdir客户端配置文件目录,用于加载 taos.cfg
host/port服务器地址与端口(原生连接默认 6030,REST 默认 6041)
user/password连接认证信息
thread_count数据写入线程数
create_table_thread_count建表线程数
confirm_parameter_prompt是否交互确认参数(yes/no
num_of_records_per_req单条写入请求包含的记录数(注意默认配置中prepared_rand若小于该值,源码会自动将num_of_records_per_req下调至prepared_rand,见 benchMain.c)
prepared_rand随机数据源大小,影响预生成的随机内存块
chinese是否生成中文字符串数据
escape_character建库建表时是否使用转义字符
continue_if_fail写入失败时是否继续
connection_pool_size连接池大小(见 insert-from-to.json)
insert_interval交错模式插入间隔(毫秒)
result_file结果统计输出文件

2. 数据库(dbinfo)配置

"databases": [ { "dbinfo": { "name": "test", "drop": "yes", "vgroups": 4, "precision": "ms" }, "super_tables": [] } ]

dbinfo支持 TDengine 建库语句的核心参数,完整示例见 insertDemo.json 与 insert_csv.json:

字段说明
name数据库名
drop是否先删除同名库(yes/no
vgroups指定 VGroup 数(3.0+)
precision时间精度:ms(毫秒)等
replica副本数
duration单文件时长,如"5d"
keep数据保留时长,如"30d"或天数
pages每 vnode 内存页数
minRows/maxRows文件块最小/最大行数
comp压缩算法选项
stt_trigger小文件触发落盘合并的阈值
wal_retention_period/wal_retention_sizeWAL 保留时长/大小
cachemodel缓存模型,如"'both'"

3. 超级表与子表配置

super_tables数组内定义每个超级表的结构与数据规模:

"super_tables": [ { "name": "meters", "child_table_exists": "no", "childtable_count": 10, "childtable_prefix": "d", "auto_create_table": "no", "data_source": "rand", "insert_mode": "taosc", "insert_rows": 10000, "timestamp_step": 10, "start_timestamp": "2020-10-01 00:00:00.000", "columns": [], "tags": [] } ]

关键字段:

字段说明
name超级表名
child_table_exists子表是否已存在(yes/no
childtable_count子表总数
childtable_prefix子表名前缀,子表名形如d0d1
childtable_from/childtable_to只操作指定编号范围的子表(见 insert-from-to.json)
auto_create_table是否自动建子表
batch_create_tbl_num批量建表数量
data_source数据来源:rand(随机生成)/sample(CSV 采样文件)
insert_mode写入接口:taosc/rest/stmt/stmt2/sml
line_protocol行协议(sml 模式):line/telnet/json
insert_rows每张子表插入的记录数
timestamp_step时间戳步长(毫秒)
start_timestamp起始时间戳,支持绝对时间或"now"(见 insertNow.json)
interlace_rows交错写入行数
insert_interval每次插入间隔(毫秒)
disorder_ratio/disorder_range乱序数据比例与乱序时间范围
partial_col_num/partial_col_from部分列写入:指定前 N 列有数据、其余为 NULL(见 insertFuns.json)
sample_format/sample_file/tags_fileCSV 数据源格式、数据文件与标签文件(见 insert_csv.json)
use_sample_ts是否使用采样文件中的时间戳
thread_bind_vgroup线程绑定 vgroup(见 insertSmall.json)
non_stop_mode不间断写入模式

4. 列(columns)与标签(tags)定义

列定义支持指定类型、范围、数量与生成函数:

"columns": [ {"type": "FLOAT", "name": "current", "count": 1, "max": 12, "min": 8 }, { "type": "INT", "name": "voltage", "max": 225, "min": 215 }, { "type": "FLOAT", "name": "phase", "max": 1, "min": 0 } ], "tags": [ {"type": "TINYINT", "name": "groupid", "max": 10, "min": 1}, {"type": "BINARY", "name": "location", "len": 16, "values": ["San Francisco", "Los Angles", "San Diego", "San Jose", "Palo Alto", "Campbell", "Mountain View", "Sunnyvale", "Santa Clara", "Cupertino"] } ]

字段说明:

  • type:数据类型。支持 BOOL、TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、BINARY、NCHAR、JSON、GEOMETRY、VARBINARY、DECIMAL 以及无符号整型(UINT、UBIGINT、UTINYINT、USMALLINT),见 sml_telnet.json 中的完整类型示例;
  • name:列/标签名;
  • min/max:数值生成的取值范围;
  • count:批量生成的同类型列数量;
  • len:BINARY/NCHAR 等变长类型的长度;
  • values:标签取值的枚举列表(循环取值);
  • fun:数据生成函数表达式(详见下一节);
  • fillNull:是否填充 NULL(见 csv-export.json)。

从源码看,benchCommandOpt.c 使用正则解析带长度/精度参数的复杂类型:BINARY|NCHAR|VARCHAR|JSON|GEOMETRY|VARBINARY(n)以及DECIMAL(p,s),并对 DECIMAL 的 precision/scale 合法性做了校验(precision 不能超过TSDB_DECIMAL128_MAX_PRECISION,scale 必须满足0 <= s <= p)。

5. 用生成函数模拟真实波形

除随机数与取值范围外,列定义中的fun支持用函数表达式模拟真实传感器波形。仓库中 insertNow.json 给出了全部六类生成函数(类型枚举定义于 bench.h,表达式解析实现于 benchJsonOpt.c):

"columns": [ { "type": "FLOAT", "name": "current", "fun": "3*sin(x)+10*random(2)"}, { "type": "INT", "name": "voltage", "fun": "40*sin(x)+200*random(10)"}, { "type": "INT", "name": "c1", "fun": "count(0,100,1,0)"}, { "type": "INT", "name": "c2", "fun": "saw(-100,100,20,0)"}, { "type": "INT", "name": "c3", "fun": "square(0,60,20,10)"}, { "type": "INT", "name": "c4", "fun": "tri(-20,100,30,10)"} ]
函数形式说明
sin(x)amp*sin(x)+bias*random(n)正弦波叠加随机噪声
cos(x)同上余弦波
count(min,max,step,offset)计数序列从 min 按 step 递增到 max,offset 为偏移
saw(min,max,period,offset)锯齿波在 min~max 间周期变化
square(min,max,period,offset)方波周期跳变
tri(min,max,period,offset)三角波线性上升下降

表达式支持倍数*函数 + 加数的组合形式,random(n)表示叠加 n 范围内的随机抖动。这类函数生成能力让压测数据更贴近工业物联网的真实采样特征(如电流/电压的波动曲线),相关示例还可见 insertDemo.json 与 insertFuns.json。

6. 不同写入接口(insert_mode)

通过insert_mode字段可以切换底层写入接口,枚举定义于 bench.h:

模式说明参考配置
taosc原生 C 客户端批量写入(默认)insert.json
restRESTful HTTP 接口写入(端口通常 6041)insert-rest.json
stmt/stmt2参数绑定(prepared statement)写入配置中直接指定
smlSchemaless 写入,可配line_protocolline(InfluxDB Line Protocol)、telnetjsonsml_telnet.json

其中 REST 模式在 benchMain.c 中会额外做服务器地址转换与 Base64 认证编码,并探测 REST 服务器主版本;同时 REST 接口不支持线程绑定 vgroup(thread_bind_vgroup),使用时会直接报错提示改用 native 或 websocket 模式。

五、查询压测

查询压测通过filetype: "query"的配置文件驱动,支持指定表查询超级表查询两类场景。

1. 指定表查询

tools/taosBenchmark/example/query.json:

{ "filetype": "query", "cfgdir": "/etc/taos", "host": "127.0.0.1", "port": 6030, "user": "root", "password": "taosdata", "confirm_parameter_prompt": "no", "continue_if_fail": "yes", "databases": "test", "query_times": 10, "query_mode": "taosc", "specified_table_query": { "threads": 3, "sqls": [ { "sql": "select last_row(*) from meters", "result": "./query_res0.txt" }, { "sql": "select count(*) from d0", "result": "./query_res1.txt" } ] } }

字段说明:

字段说明
databases查询目标数据库
query_times每条 SQL 重复执行的次数
query_mode查询连接方式:taosc
specified_table_query.threads查询线程数
specified_table_query.sqlsSQL 列表,sql为查询语句,result为结果输出文件

2. SQL 文件批量查询

当 SQL 较多时,可写入文本文件并用sql_file引用,见 query-with-file.json:

"specified_table_query": { "query_interval": 1, "concurrent": 3, "sql_file": "./query-sqls.txt" }

每行一条 SQL(参考 query-sqls.txt):

select last_row(*) from meters select count(*) from d0

同时支持kill_slow_query_threshold(慢查询判定阈值秒数)与kill_slow_query_interval(检查间隔)两个字段,用于自动终止超时查询。

3. 超级表查询

tools/taosBenchmark/example/queryStb.json 演示了按超级表维度组织查询 SQL 的写法,super_table_query节点下通过stblname指定超级表名、threads指定线程数、sqls列出查询语句(SQL 中的xxxx会被替换为实际子表名)。

4. 插入后的自动聚合查询

使用命令行-x--aggr-func)选项,可在插入完成后自动对全部数据执行*count(*)avgsummaxminfirstlast等聚合查询并输出统计,聚合函数列表在 benchCommandOpt.c 中定义,demo 模式下使用g_aggreFuncDemo(针对current列),非 demo 模式使用g_aggreFunc(针对C0列)。

六、数据订阅(TMQ)压测

订阅压测基于 TDengine 的消息队列(TMQ)能力,配置文件的filetypesubscribe。仓库提供了两份等价配置:subscribe.json 与 tmq.json,核心结构如下:

{ "filetype": "subscribe", "cfgdir": "/etc/taos", "host": "127.0.0.1", "port": 6030, "user": "root", "password": "taosdata", "result_file": "tmq_res.txt", "tmq_info": { "concurrent": 3, "poll_delay": 100000, "group.id": "", "group_mode": "independent", "create_mode": "parallel", "client.id": "cliid_0001", "auto.offset.reset": "earliest", "enable.manual.commit": "false", "enable.auto.commit": "false", "auto.commit.interval.ms": 1000, "experimental.snapshot.enable": "false", "msg.with.table.name": "false", "rows_file": "rowfile", "topic_list": [ {"name": "topic1", "sql": "select * from test.meters;"} ] } }

tmq_info中的关键订阅参数:

字段说明
concurrent消费并发数
poll_delay轮询间隔(微秒)
group.id消费组 ID(留空则自动生成)
group_mode消费组模式,independent
create_mode消费组创建方式,parallel
client.id客户端标识
auto.offset.reset无提交位点时从何处开始消费(earliest/latest
enable.manual.commit/enable.auto.commit手动/自动提交偏移量开关
auto.commit.interval.ms自动提交间隔(毫秒)
experimental.snapshot.enable是否启用快照
msg.with.table.name消息是否携带表名
topic_list订阅主题列表,name为主题名,sql为订阅的查询语句

订阅压测用于验证消息推送链路在高并发消费下的稳定性与延迟表现,是检验数据订阅/流处理前置环节的重要手段。

七、CSV 数据文件生成

filetype: "csvfile"模式用于只生成 CSV 数据文件而不连接数据库,生成的文本文件可用于后续的数据导入或作为其他工具的输入。csv-export.json 提供了完整示例:

{ "filetype": "csvfile", "output_path": "./csv/", "databases": [ { "dbinfo": { "name": "csvdb", "precision": "ms" }, "super_tables": [ { "name": "table", "childtable_count": 1010, "insert_rows": 1000, "childtable_prefix": "d", "timestamp_step": 1000000, "start_timestamp": "2020-10-01 00:00:00.000", "childtable_from": 1000, "childtable_to": 1010, "csv_file_prefix": "data", "csv_ts_format": "%Y%m%d", "csv_ts_interval": "1d", "csv_output_header": "true", "csv_tbname_alias": "device_id", "csv_compress_level": "none", "columns": [], "tags": [] } ] } ] }

CSV 专属字段:

字段说明
output_path输出目录
csv_file_prefix生成文件名前缀
csv_ts_format时间戳格式(如%Y%m%d
csv_ts_interval时间戳间隔(如1d
csv_output_header是否输出表头
csv_tbname_alias子表名列名别名
csv_compress_level压缩级别(如none

八、源码结构:快速定位实现

如果想深入理解 taosBenchmark 的实现,可按以下模块在仓库中定位(源码位于 tools/taosBenchmark/src):

文件职责
benchMain.c主入口:参数校验、JSON 加载、结果文件打开、SIGINT 优雅退出处理
benchSys.c命令行选项定义与解析
benchJsonOpt.cJSON 配置文件解析、生成函数表达式解析
benchCommandOpt.c数据类型解析、默认参数初始化、聚合查询线程
benchInsert.c写入线程调度与内存估算
benchQuery.c查询执行
benchTmq.cTMQ 订阅消费
benchCsv.cCSV 数据生成
wrapDb.c对 taosc / REST 等客户端接口的统一封装
bench.h数据结构、默认值、枚举与工具宏定义

主流程大致为:main()→ 解析命令行 → 加载 JSON(readJsonConfig)或应用命令行默认参数(modifyArgument)→ 校验参数(checkArgumentValid,见 benchMain.c)→ 按test_mode分发到写入/查询/订阅/CSV 四个执行路径。其中参数校验会检查prepared_randnum_of_records_per_req的约束、REST 模式与bind_vgroup的互斥、以及批量查询(batch_query)对mixed_query的依赖关系。

九、典型使用流程小结

一个完整的压测流程通常如下:

  1. 编译安装taosBenchmark(依赖 → TDengine 客户端 →cmake .. && make && sudo make install);
  2. 启动目标 TDengine 集群(本机默认端口 6030);
  3. 写入压测:基于 insert.json 修改库表结构与数据规模,运行taosBenchmark -f insert.json
  4. 查询压测:写入完成后,基于 query.json 组织压测 SQL,运行taosBenchmark -f query.json
  5. 订阅压测:基于 subscribe.json 验证 TMQ 消费链路,运行taosBenchmark -f subscribe.json
  6. result_file输出文件中读取各阶段的吞吐量、耗时与失败统计,评估性能基线。

结语

taosBenchmark 作为 TDengine 官方压测工具,覆盖了写入(原生/REST/参数绑定/Schemaless 多接口)、查询(指定表/超级表/聚合)、订阅(TMQ)与 CSV 数据生成四大场景,配合 JSON 配置的精细化控制,足以支撑从单机功能验证到集群容量规划的各种测试需求。本文所述全部配置示例与默认值均可从当前仓库的 tools/taosBenchmark/example 目录与源码中直接查阅验证。

【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询