文章目录

    • 一、基本信息
    • 二、基准测试策略
    • 三、基准测试过程
      • 1. 模拟高并发写入场景
      • 2. 模拟并发查询场景
    • 四、基准测试结论

一、基本信息

  • TDengine 版本:3.3.6.13(目前最新版本)
  • 服务器配置:16核CPU,32GB内存,高IO 1000GB存

二、基准测试策略

  • 测试数据库:
    • 数据库:test
    • 超级表:meters(含字段 ts, current, voltage, phase 和标签 groupid, location)
  • 测试工具:taosBenchmark(TDengine 自带的性能测试工具)
  • 测试目标​​:
    • 模拟高并发写入场景,评估数据库的写入性能。
    • 模拟并发查询场景,评估数据库的查询性能。

三、基准测试过程

1. 模拟高并发写入场景

root@sjfwq-v1-p-0-107:~# taosBenchmark -y
[07/21 11:48:25.593007] INFO: client version: 3.3.6.13Connect mode is : Native[07/21 11:48:26.910499] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.188987] INFO: command to create database: <CREATE DATABASE IF NOT EXISTS test PRECISION 'ms';>
[07/21 11:48:27.189020] SUCC: created database (test)
[07/21 11:48:27.189332] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.191098] INFO: stable meters does not exist, will create one
[07/21 11:48:27.191125] INFO: create stable: <CREATE TABLE IF NOT EXISTS test.meters (ts TIMESTAMP,current float,voltage int,phase float) TAGS (groupid int,location binary(24))>
[07/21 11:48:27.191389] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.200606] INFO: generate stable<meters> columns data with lenOfCols<80> * prepared_rand<20000>
[07/21 11:48:27.219827] INFO: restful connect -> convertServAddr host=localhost port:6041 to serv_addr=0x2ad77f24 iface=0 
[07/21 11:48:27.219839] INFO: start creating 10000 table(s) with 8 thread(s)
[07/21 11:48:27.220192] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.220668] INFO: thread[0] start creating table from 0 to 1249
[07/21 11:48:27.220788] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.221215] INFO: thread[1] start creating table from 1250 to 2499
[07/21 11:48:27.221367] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.221881] INFO: thread[2] start creating table from 2500 to 3749
[07/21 11:48:27.221922] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.222315] INFO: thread[3] start creating table from 3750 to 4999
[07/21 11:48:27.222393] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.223102] INFO: thread[4] start creating table from 5000 to 6249
[07/21 11:48:27.223197] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.223581] INFO: thread[5] start creating table from 6250 to 7499
[07/21 11:48:27.223683] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.224055] INFO: thread[6] start creating table from 7500 to 8749
[07/21 11:48:27.224163] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.225133] INFO: thread[7] start creating table from 8750 to 9999
[07/21 11:48:27.662916] SUCC: Spent 0.4430 seconds to create 10000 table(s) with 8 thread(s) speed: 22573 tables/s, already exist 0 table(s), actual 10000 table(s) pre created, 0 table(s) will be auto created
[07/21 11:48:27.663173] INFO: init pthread_join 0 ...
[07/21 11:48:27.663240] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.663282] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.663320] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.663243] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.663362] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.663362] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.663409] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.663418] SUCC: host:(null) port:0  connect successfully.
[07/21 11:48:27.663853] INFO: init pthread_join 1 ...
[07/21 11:48:27.663864] INFO: init pthread_join 2 ...
[07/21 11:48:27.663949] INFO: init pthread_join 3 ...
[07/21 11:48:27.663956] INFO: init pthread_join 4 ...
[07/21 11:48:27.663983] INFO: init pthread_join 5 ...
[07/21 11:48:27.664106] INFO: init pthread_join 6 ...
[07/21 11:48:27.664125] INFO: init pthread_join 7 ...
[07/21 11:48:27.664188] INFO: Estimate memory usage: 12.20MB
[07/21 11:48:27.664196] INFO: run insert thread. real nthread=8
[07/21 11:48:27.664234] INFO: thread[0] start progressive inserting into table from 0 to 1250
[07/21 11:48:27.664255] INFO: thread[1] start progressive inserting into table from 1250 to 2500
[07/21 11:48:27.664278] INFO: thread[2] start progressive inserting into table from 2500 to 3750
[07/21 11:48:27.664295] INFO: thread[3] start progressive inserting into table from 3750 to 5000
[07/21 11:48:27.664323] INFO: thread[4] start progressive inserting into table from 5000 to 6250
[07/21 11:48:27.664358] INFO: thread[5] start progressive inserting into table from 6250 to 7500
[07/21 11:48:27.664381] INFO: thread[6] start progressive inserting into table from 7500 to 8750
[07/21 11:48:27.664388] INFO: pthread_join 0 ...
[07/21 11:48:27.664401] INFO: thread[7] start progressive inserting into table from 8750 to 10000
[07/21 11:48:52.467670] SUCC: thread[1] progressive mode, completed total inserted rows: 12500000, 537815.02 records/second
[07/21 11:48:52.528920] SUCC: thread[3] progressive mode, completed total inserted rows: 12500000, 535889.46 records/second
[07/21 11:48:52.644246] SUCC: thread[7] progressive mode, completed total inserted rows: 12500000, 534693.89 records/second
[07/21 11:48:52.693441] SUCC: thread[4] progressive mode, completed total inserted rows: 12500000, 533009.17 records/second
[07/21 11:48:52.753257] SUCC: thread[0] progressive mode, completed total inserted rows: 12500000, 532702.66 records/second
[07/21 11:48:52.753402] INFO: pthread_join 1 ...
[07/21 11:48:52.753416] INFO: pthread_join 2 ...
[07/21 11:48:52.772948] SUCC: thread[5] progressive mode, completed total inserted rows: 12500000, 532017.61 records/second
[07/21 11:48:52.879224] SUCC: thread[6] progressive mode, completed total inserted rows: 12500000, 529537.68 records/second
[07/21 11:48:53.156213] SUCC: thread[2] progressive mode, completed total inserted rows: 12500000, 524104.91 records/second
[07/21 11:48:53.156314] INFO: pthread_join 3 ...
[07/21 11:48:53.156329] INFO: pthread_join 4 ...
[07/21 11:48:53.156374] INFO: pthread_join 5 ...
[07/21 11:48:53.156401] INFO: pthread_join 6 ...
[07/21 11:48:53.156413] INFO: pthread_join 7 ...
[07/21 11:48:53.157329] SUCC: Spent 25.492230 (real 23.476738) seconds to insert rows: 100000000 with 8 thread(s) into test 3922763.92 (real 4259535.55) records/second
[07/21 11:48:53.157361] SUCC: insert delay, min: 8.7650ms, avg: 18.7814ms, p90: 17.1450ms, p95: 29.5320ms, p99: 366.1130ms, max: 670.7390ms
[07/21 11:48:53.157378] INFO: free resource and exit ... 

结果解读:

  • 数据库初始化与表创建测试​:创建超级表、子表创建 (10,000张),耗时:​​0.443秒​​,​​22,573表/秒​​
  • 数据写入测试​:数据量(1亿行),写入线程(8线程),总耗时(​​25.49秒​​),写入吞吐量(​​3,922,764行/秒​​),平均延迟(18.78ms)

2. 模拟并发查询场景

root@sjfwq-v1-p-0-107:~/taosBenchmark# taosBenchmark -f query.json 
[07/21 17:02:22.358884] INFO: 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":	{"query_interval":	1,"threads":	3,"sqls":	[{"sql":	"select last_row(*) from meters","result":	"./query_res0.txt"}, {"sql":	"select count(*) from d0","result":	"./query_res1.txt"}]}
}
[07/21 17:02:22.359004] INFO: read host from json: 127.0.0.1 .
[07/21 17:02:22.359011] INFO: read user from json: root .
[07/21 17:02:22.359013] INFO: read password from json: ** .
[07/21 17:02:22.408407] INFO: client version: 3.3.6.13Connect mode is : Native[07/21 17:02:22.411254] INFO: Set engine cfgdir successfully, dir:/etc/taos
[07/21 17:02:23.693357] SUCC: host:127.0.0.1 port:0  connect successfully.
[07/21 17:02:23.722231] SUCC: host:127.0.0.1 port:0  connect successfully.
[07/21 17:02:23.722993] SUCC: host:127.0.0.1 port:0  connect successfully.
complete query with 3 threads and 30 sql 1 spend 3.845735s QPS: 7.801 query delay avg: 0.382693s min: 0.367124s max: 0.419617s p90: 0.395527s p95: 0.416581s p99: 0.419617s SQL command: select last_row(*) from meters 
[07/21 17:02:27.569303] SUCC: host:127.0.0.1 port:0  connect successfully.
[07/21 17:02:27.569746] SUCC: host:127.0.0.1 port:0  connect successfully.
[07/21 17:02:27.570143] SUCC: host:127.0.0.1 port:0  connect successfully.
[07/21 17:02:27.572642] INFO: do sleep 1ms ...
[07/21 17:02:27.573148] INFO: do sleep 1ms ...
[07/21 17:02:27.573166] INFO: do sleep 1ms ...
[07/21 17:02:27.574560] INFO: do sleep 1ms ...
[07/21 17:02:27.577159] INFO: do sleep 1ms ...
[07/21 17:02:27.577603] INFO: do sleep 1ms ...
[07/21 17:02:27.577804] INFO: do sleep 1ms ...
[07/21 17:02:27.579129] INFO: do sleep 1ms ...
[07/21 17:02:27.579714] INFO: do sleep 1ms ...
[07/21 17:02:27.581079] INFO: do sleep 1ms ...
[07/21 17:02:27.581663] INFO: do sleep 1ms ...
[07/21 17:02:27.582607] INFO: do sleep 1ms ...
[07/21 17:02:27.583555] INFO: do sleep 1ms ...
[07/21 17:02:27.584650] INFO: do sleep 1ms ...
[07/21 17:02:27.585559] INFO: do sleep 1ms ...
complete query with 3 threads and 30 sql 2 spend 0.016352s QPS: 1834.638 query delay avg: 0.000997s min: 0.000745s max: 0.001392s p90: 0.001370s p95: 0.001387s p99: 0.001392s SQL command: select count(*) from d0 
[07/21 17:02:27.586718] INFO: Spend 5.1750 second completed total queries: 60, the QPS of all threads:     11.594 ,error 0 (rate:0.000%)[07/21 17:02:27.586729] INFO: free resource and exit ...

结果解读:

  • 数据查询测试​:SELECT COUNT(*) FROM d0(​​1,654.6 QPS​​,平均延迟0.000948s )
  • 数据查询测试: SELECT last_row(*) from METERS( ​​5.415​​ QPS), 查询 METERS 表的​​最新行数, METERS 表数据量很大(1 亿行),TDengine 需要扫描索引找到最新数据,可能涉及磁盘 I/O,所以很慢。

四、基准测试结论

  • 写入性能​​:

    • 1亿行数据写入仅耗时25.49秒,吞吐量达 ​​400万行/秒​​ 级别,远超传统时序数据库(如InfluxDB的10万~50万行/秒)。
    • 子表创建速度极快(22,573表/秒),适合大规模设备接入场景。
  • 查询性能​​:

    • COUNT(*)查询​​:QPS极高(1,654.6),因仅需统计单表行数,适合高频监控场景。
    • select last_row():查询 meters 表的 ​​最新行数据​​(类似于 SELECT * FROM meters ORDER BY ts DESC LIMIT 1),如果 meters 表数据量极大(如 1 亿行),last_row() 需要扫描所有子表或索引,导致延迟高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91406.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91406.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91406.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【IQA技术专题】DISTS代码讲解

本文是对DISTS图像质量评价指标的代码解读&#xff0c;原文解读请看DISTS文章讲解。 本文的代码来源于IQA-Pytorch工程。 1、原文概要 以前的一些IQA方法对于捕捉纹理上的感知一致性有所欠缺&#xff0c;鲁棒性不足。基于此&#xff0c;作者开发了一个能够在图像结构和图像纹…

2024年SEVC SCI2区,一致性虚拟领航者跟踪群集算法GDRRT*-PSO+多无人机路径规划,深度解析+性能实测

目录1.摘要2.算法背景3.GDRRT*-PSO与虚拟领航者跟踪算法4.结果展示5.参考文献6.算法辅导应用定制读者交流1.摘要 随着无人机技术的快速发展及其卓越的运动和机动性能&#xff0c;无人机在社会和军事等诸多领域得到了广泛应用。多无人机协同作业&#xff0c;能够显著提升任务执…

链特异性文库是什么?为什么它在转录组测序中越来越重要?

链特异性文库是什么&#xff1f;为什么它在转录组测序中越来越重要&#xff1f; 在现代分子生物学研究中&#xff0c;RNA测序&#xff08;RNA-seq&#xff09; 是一种广泛应用的技术&#xff0c;用于分析基因在不同条件下的表达情况。而在RNA-seq的众多技术细节中&#xff0c;有…

ClickHouse vs PostgreSQL:数据分析领域的王者之争,谁更胜一筹?

文章概要 作为一名数据架构师&#xff0c;我经常被问到一个问题&#xff1a;在众多数据库选择中&#xff0c;ClickHouse和PostgreSQL哪一个更适合我的项目&#xff1f;本文将深入探讨这两种数据库系统的核心差异、性能对比、适用场景以及各自的优缺点&#xff0c;帮助您在技术选…

面向对象系统的单元测试层次

面向对象系统的单元测试层次面向对象&#xff08;Object-Oriented, OO&#xff09;编程范式引入了封装、继承和多态等核心概念&#xff0c;这使得传统的、基于函数的单元测试方法不再充分。面向对象系统的单元测试必须适应其独特的结构和行为特性&#xff0c;从单一方法扩展到类…

如何用USRP捕获手机信号波形(上)系统及知识准备

目录&#xff1a; 如何用USRP捕获手机信号波形&#xff08;上&#xff09;系统及知识准备 如何用USRP捕获手机信号波形&#xff08;中&#xff09;手机/基站通信 如何用USRP捕获手机信号波形&#xff08;下&#xff09;协议分析 一、手机通信参数获取 首先用Cellular-z网络…

C语言-数组:数组(定义、初始化、元素的访问、遍历)内存和内存地址、数组的查找算法和排序算法;

本章概述思维导图&#xff1a;C语言数组在C语言中&#xff0c;数组是一种固定大小的、相同类型元素的有序集合&#xff0c;通过索引&#xff08;下标&#xff09;访问。数组数组&#xff1a;是一种容器&#xff0c;可以用来存储同种数据类型的多个值&#xff1b;数组特点&#…

河南萌新联赛2025第(二)场:河南农业大学(补题)

文章目录前言A.约数个数和整除分块(相当于约数求和)相关例题&#xff1a;取模B.异或期望的秘密二进制的规律相关例题累加器小蓝的二进制询问乘法逆元1. 概念2.基本定义3.费马小定理1.定理内容2.重要推论D.开罗尔网络的备用连接方案E.咕咕嘎嘎!!!(easy)I.猜数游戏(easy)K.打瓦M.…

常见中间件漏洞

一、TomcatTomcat put方法任意文件写入漏洞环境搭建&#xff0c;启动时端口被占用就改yml配置文件&#xff0c;改成8081端口。(我这里是8080)cd vulhub-master/tomcat/CVE-2017-12615 docker-compose up -d 去抓包&#xff0c;改成put提交。下面的内容是用哥斯拉生成的木马文件…

27.(vue3.x+vite)以pinia为中心的开发模板(监听watch)

效果截图 代码实现: HelloWorld.vue <template><div style="padding: 20px">介绍:<br />1:使用统一的 watch 来监听store的值。<br

Jenkins 详解

Jenkins 是一个开源的持续集成和持续交付(CI/CD)工具&#xff0c;用于自动化软件开发过程中的构建、测试和部署阶段。以下是关于 Jenkins 的详细介绍&#xff1a; 1. Jenkins 核心概念 1.1 持续集成(CI) 开发人员频繁地将代码变更提交到共享仓库每次提交都会触发自动构建和测试…

动态配置实现过程

查看DCCValueBeanFactory类的完整实现&#xff0c;了解动态配置的实现过程 动态配置实现过程 1. 自定义注解 使用DCCValue注解标记需要动态配置的字段&#xff0c;格式为key:defaultValue&#xff1a; DCCValue("downgradeSwitch:0") private String downgradeSw…

【大模型理论篇】跨语言AdaCOT

参考&#xff1a;AdaCoT: Rethinking Cross-Lingual Factual Reasoning throughAdaptive Chain-of-ThoughtAdaCoT&#xff08;Adaptive Chain-of-Thought&#xff0c;自适应思维链&#xff09;是一项提升大型语言模型&#xff08;LLMs&#xff09;跨语言事实推理能力的新框架。…

vue3项目搭建

前一段时间招聘前端开发,发现好多开发连基本的创建项目都不会,这里总结一下 在Vue 3中,使用Webpack和Vite创建的项目文件结构及语言(JS/TS)的选择有以下主要区别: 1. 创建方式与文件结构差异 方式一、Webpack(Vue CLI) 创建命令: vue create project-name 典型文件结构…

企业签名的多种形式

企业签名有多种形式&#xff0c;可分为企业签名独立版、企业签名稳定版、企业签名共享版等。每一种形式的企业签名都有其独特的特点&#xff0c;其中&#xff1a;  企业签名独立版&#xff1a;其特性主要为稳定性较高&#xff0c;使用者可以通过控制APP的下载量来保证APP的稳…

解构远程智能系统的视频能力链:从RTSP|RTMP协议接入到Unity3D头显呈现全流程指南

在人工智能奔腾的2025年&#xff0c;WAIC&#xff08;世界人工智能大会&#xff09;释放出一个明确信号&#xff1a;视频能力已经成为通往“远程智能”的神经中枢。在无人机、四足机器人、远程施工、巡检等新兴场景中&#xff0c;一套可靠、低延迟、可嵌入头显设备的视频传输系…

Less Less基础

1.lessless是一种动态样式语言&#xff0c;属于CSS预处理器的范畴&#xff0c;它扩展了CSS语言&#xff0c;增加了变量&#xff0c;Mixin&#xff0c;函数等特性&#xff0c;使CSS更易维护和扩展。Less既可以在客户端上运行&#xff0c;也可以借助Node.js在服务端运行。2.Less中…

如何使用 Redis 实现 API 网关或单个服务的请求限流?

使用 Redis 高效实现 API 网关与服务的请求限流 在微服务架构中&#xff0c;对 API 网关或单个服务的请求进行速率限制至关重要&#xff0c;以防止恶意攻击、资源滥用并确保系统的稳定性和可用性。 Redis 凭借其高性能、原子操作和丰富的数据结构&#xff0c;成为实现请求限流的…

图片查重从设计到实现(7) :使用 Milvus 实现高效图片查重功能

使用 Milvus 实现高效图片查重功能本文将介绍如何利用 Milvus 向量数据库构建一个高效的图片查重系统&#xff0c;通过传入图片就能快速从已有数据中找出匹配度高的相似图片。一.什么是图片查重&#xff1f; 图片查重指的是通过算法识别出内容相同或高度相似的图片&#xff0c;…

诱导多能干细胞(iPSC)的自述

自十七年前诱导多能干细胞&#xff08;也称iPS细胞或iPSC&#xff09;技术出现以来&#xff0c;干细胞生物学和再生医学取得了巨大进展。人类iPSC已广泛用于疾病建模、药物发现和细胞疗法开发。新的病理机制已被阐明&#xff0c;源自iPSC筛选的新药正在研发中&#xff0c;并且首…