如何用TDengine实现每秒10万条写入:高吞吐写入优化与taosBenchmark压测完整实操
【免费下载链接】tdengineTDengine is an open source, high-performance, cloud native time-series database optimized for Internet of Things (IoT), Connected Cars, Industrial IoT and DevOps.项目地址: https://gitcode.com/taosdata/tdengine
TDengine 是一款高性能时序数据库,配合官方压测工具 taosBenchmark,你可以轻松验证并调优出每秒 10 万条以上的高吞吐写入能力。本文面向新手,用最小代码量带你走完"装好工具 → 跑默认压测 → 调优关键参数 → 看懂性能报告"的完整实操路径,帮你在 IoT、监控场景中把写入吞吐量拉到满格。
为什么 TDengine 能轻松做到高吞吐写入
在动手之前,先理解三个决定写入速度的设计,调优时心里才有数:
| 设计 | 对写入吞吐的作用 |
|---|---|
| 超级表 + 子表模型 | 每台设备一张子表,元数据统一管理,批量写入时按子表切分并行 |
| 两级时间序列压缩 | 压缩比高、写入后落盘快,减少磁盘 IO 等待 |
| vgroup 数据分片 | 数据分散到多个 vgroup,写入线程可真正并行 |
💡 记住一条主线:减少网络请求次数(批量)+ 减少 SQL 解析开销(参数绑定)+ 让线程真正并行(线程数与 vgroup 对齐),这就是每秒 10 万条写入的全部秘密。
一键体验:无参数模式跑 taosBenchmark
taosBenchmark 是 TDengine 安装包中的默认组件,安装完成即可直接使用,源码位于 tools/taosBenchmark/。它支持三种运行模式:
- 无参数模式:直接执行
taosBenchmark,自动建库(test 库、meters 超级表、10000 张子表,每表 1 万条),适合 30 秒快速体验; - 命令行模式:如
taosBenchmark -d db -t 100 -n 1000 -T 4 -I stmt2 -y,一行命令搞定写入压测; - JSON 配置文件模式:
taosBenchmark -f <json文件>,配置项最全,是生产压测的推荐方式。
⚠️ 运行前请确认 taosd 服务正常:sudo systemctl status taosd。
五大高吞吐写入优化技巧(压测参数级讲解)
以下每个技巧都对应 taosBenchmark 的一个具体参数,官方参数全表见 docs/zh/12-operations-and-tooling/04-tools/04-taosbenchmark.md。
1. 用 stmt2 参数绑定替代普通 SQL
insert_mode有四个选项:taosc(普通写入)、stmt、stmt2(参数绑定 v1/v2)、sml(无模式接口)。参数绑定免去每条数据的 SQL 拼接与解析,是吞吐提升最明显的一项,压测时优先选stmt2。
2. 调大单次请求行数 num_of_records_per_req
默认 30000 行/次。批量越大,网络往返和解析开销越摊薄。注意:设置过高客户端会报错,可按 10000~30000 逐步试探。
3. 线程数 thread_count 与 vgroup 数对齐
thread_count默认 8。并行写入的前提是数据分布在足够的 vgroup 上——建库时用vgroups指定分片数(命令行-v),再让线程数等于或小于 vgroup 数。
4. 开启线程绑定 vgroup:thread_bind_vgroup
设为"yes"后,写入线程与 vgroup 一一绑定,避免线程间争抢同一分片,官方文档明确指出该选项可提升写入速度。
5. 大子表场景开启元数据预加载 pre_load_tb_meta
当子表数量达到数万、数十万级别时,设为"yes"可提前加载子表元数据,避免写入时反复查询元信息拖慢速度。
🔎 子表数特别多的场景(交错写入)还可配合interlace_rows(交错插入)让多表数据混合在同一请求中发送,进一步摊薄开销。
完整实操:编写高吞吐压测配置文件
以仓库自带的 tools/taosBenchmark/case/insertStmt2.json 为模板,改造核心字段如下:
{ "filetype": "insert", "host": "127.0.0.1", "port": 6030, "user": "root", "password": "taosdata", "num_of_records_per_req": 10000, "thread_count": 4, "thread_bind_vgroup": "yes", "pre_load_tb_meta": "yes", "databases": [ { "dbinfo": { "name": "bench", "drop": "yes", "vgroups": 4 }, "super_tables": [ { "name": "meters", "childtable_count": 10000, "childtable_prefix": "d", "insert_mode": "stmt2", "auto_create_table": "no", "insert_rows": 10000, "timestamp_step": 1000 } ] } ] }执行压测:
taosBenchmark -f bench.json -o result.txt📌 10000 张子表 × 10000 条 = 1 亿行数据。首次运行会先建表再写入,耐心等待即可;-o指定的结果文件便于留档对比。
读懂压测报告:records/second 与 p99 延迟
写入完成后,taosBenchmark 会输出两行关键指标:
SUCC: Spent 8.53 (real 8.12) seconds to insert rows: 10000000 with 8 thread(s) into test 1172704 (real 1231924) records/second SUCC: insert delay, min: 19.7ms, avg: 64.9ms, p90: 94.7ms, p95: 105.2ms, p99: 130.7ms, max: 157.1ms| 指标 | 含义 | 关注点 |
|---|---|---|
records/second | 总写入速度,括号内为纯引擎速度(扣除压测框架准备数据的时间) | 对比调优前后的核心数字 |
avg / p99 / max | 单次写入延迟分布 | p99 是否稳定,判断长尾 |
✅ 验证方法:先在默认配置下跑一次记录基线,然后每次只改一个参数(stmt2 → 线程数 → 批量 → bind_vgroup)重复压测,逐层观察增益,最终就能直观看到从几万条/秒爬升到10 万+ 条/秒的过程。
写入的数据还可以接入 Grafana 做可视化验证,效果示例:
常见踩坑清单
- ❌子表建好再写入却开了 auto_create_table:
child_table_exists与实际不符会报错,压测前用show tables核对; - ❌thread_count 远大于 vgroup 数:线程空转,并行度无效,两者对齐是关键;
- ❌num_of_records_per_req 过大:客户端直接返回包超长错误,降回 10000~30000;
- ❌磁盘 IO 成瓶颈:时序数据建议 SSD,
-G参数可打开性能统计辅助定位; - ❌跨库混写:一次压测只压一个库,避免 vgroup 分布混乱干扰结论。
进阶参考
- taosBenchmark 完整参数手册:docs/zh/12-operations-and-tooling/04-tools/04-taosbenchmark.md
- 更多压测 JSON 案例(乱序写入、压缩写入、IO 压测等):tools/taosBenchmark/case/
- 官方连接器高效写入特性(百万级吞吐管道):docs/zh/10-developer-guide/05-high-throughput.md
- taosBenchmark 源码与工具说明:tools/taosBenchmark/README-CN.md
按本文路径走一遍,你不仅得到一份属于自己的写入性能基线,更掌握了 TDengine 高吞吐写入的调优方法论——这套方法同样适用于 Java/Go 等连接器的生产写入链路优化。
【免费下载链接】tdengineTDengine is an open source, high-performance, cloud native time-series database optimized for Internet of Things (IoT), Connected Cars, Industrial IoT and DevOps.项目地址: https://gitcode.com/taosdata/tdengine
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考