尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

TDengine 压测利器 taosBenchmark 完全指南:从源码构建到写入/查询/订阅全功能压测 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 数据文件二、从源码构建 taosBenchmark1. 安装依赖软件包Ubuntu / Debian 系统sudo apt install libjansson-dev libsnappy-dev liblzma-dev libz-dev zlib1g pkg-config libssl-dev gawkCentOS 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 gawkCentOS 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|#baseurlhttp://mirror.centos.org|baseurlhttp://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 -- bashmacOS 系统目前仅支持编译 taosBenchmarkbrew install argp-standalone gawk2. 安装 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_COMPATIBLE2.0.0.0 make4. 安装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起始时间戳15000000000002017-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_NTHREADS、DEFAULT_CHILDTABLES、DEFAULT_PORT、DEFAULT_PREPARED_RAND、DEFAULT_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配置文件类型此处为insertcfgdir客户端配置文件目录用于加载 taos.cfghost/port服务器地址与端口原生连接默认 6030REST 默认 6041user/password连接认证信息thread_count数据写入线程数create_table_thread_count建表线程数confirm_parameter_prompt是否交互确认参数yes/nonum_of_records_per_req单条写入请求包含的记录数注意默认配置中prepared_rand若小于该值源码会自动将num_of_records_per_req下调至prepared_rand见 benchMain.cprepared_rand随机数据源大小影响预生成的随机内存块chinese是否生成中文字符串数据escape_character建库建表时是否使用转义字符continue_if_fail写入失败时是否继续connection_pool_size连接池大小见 insert-from-to.jsoninsert_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/novgroups指定 VGroup 数3.0precision时间精度ms毫秒等replica副本数duration单文件时长如5dkeep数据保留时长如30d或天数pages每 vnode 内存页数minRows/maxRows文件块最小/最大行数comp压缩算法选项stt_trigger小文件触发落盘合并的阈值wal_retention_period/wal_retention_sizeWAL 保留时长/大小cachemodel缓存模型如both3. 超级表与子表配置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/nochildtable_count子表总数childtable_prefix子表名前缀子表名形如d0、d1childtable_from/childtable_to只操作指定编号范围的子表见 insert-from-to.jsonauto_create_table是否自动建子表batch_create_tbl_num批量建表数量data_source数据来源rand随机生成/sampleCSV 采样文件insert_mode写入接口taosc/rest/stmt/stmt2/smlline_protocol行协议sml 模式line/telnet/jsoninsert_rows每张子表插入的记录数timestamp_step时间戳步长毫秒start_timestamp起始时间戳支持绝对时间或now见 insertNow.jsoninterlace_rows交错写入行数insert_interval每次插入间隔毫秒disorder_ratio/disorder_range乱序数据比例与乱序时间范围partial_col_num/partial_col_from部分列写入指定前 N 列有数据、其余为 NULL见 insertFuns.jsonsample_format/sample_file/tags_fileCSV 数据源格式、数据文件与标签文件见 insert_csv.jsonuse_sample_ts是否使用采样文件中的时间戳thread_bind_vgroup线程绑定 vgroup见 insertSmall.jsonnon_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批量生成的同类型列数量lenBINARY/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_PRECISIONscale 必须满足0 s p。5. 用生成函数模拟真实波形除随机数与取值范围外列定义中的fun支持用函数表达式模拟真实传感器波形。仓库中 insertNow.json 给出了全部六类生成函数类型枚举定义于 bench.h表达式解析实现于 benchJsonOpt.ccolumns: [ { 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 递增到 maxoffset 为偏移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.jsonrestRESTful HTTP 接口写入端口通常 6041insert-rest.jsonstmt/stmt2参数绑定prepared statement写入配置中直接指定smlSchemaless 写入可配line_protocol为lineInfluxDB Line Protocol、telnet、jsonsml_telnet.json其中 REST 模式在 benchMain.c 中会额外做服务器地址转换与 Base64 认证编码并探测 REST 服务器主版本同时 REST 接口不支持线程绑定 vgroupthread_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.jsonspecified_table_query: { query_interval: 1, concurrent: 3, sql_file: ./query-sqls.txt }每行一条 SQL参考 query-sqls.txtselect 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(*)、avg、sum、max、min、first、last等聚合查询并输出统计聚合函数列表在 benchCommandOpt.c 中定义demo 模式下使用g_aggreFuncDemo针对current列非 demo 模式使用g_aggreFunc针对C0列。六、数据订阅TMQ压测订阅压测基于 TDengine 的消息队列TMQ能力配置文件的filetype为subscribe。仓库提供了两份等价配置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消费组创建方式parallelclient.id客户端标识auto.offset.reset无提交位点时从何处开始消费earliest/latestenable.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%dcsv_ts_interval时间戳间隔如1dcsv_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()→ 解析命令行 → 加载 JSONreadJsonConfig或应用命令行默认参数modifyArgument→ 校验参数checkArgumentValid见 benchMain.c→ 按test_mode分发到写入/查询/订阅/CSV 四个执行路径。其中参数校验会检查prepared_rand与num_of_records_per_req的约束、REST 模式与bind_vgroup的互斥、以及批量查询batch_query对mixed_query的依赖关系。九、典型使用流程小结一个完整的压测流程通常如下编译安装taosBenchmark依赖 → TDengine 客户端 →cmake .. make sudo make install启动目标 TDengine 集群本机默认端口 6030写入压测基于 insert.json 修改库表结构与数据规模运行taosBenchmark -f insert.json查询压测写入完成后基于 query.json 组织压测 SQL运行taosBenchmark -f query.json订阅压测基于 subscribe.json 验证 TMQ 消费链路运行taosBenchmark -f subscribe.json从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),仅供参考
返回列表