热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TDengine的用户如何优化数据的写入速度?

TDengine的用户如何优化数据的写入速度?-大家都听过这样的一句话:在物联网大数据的场景之下,TDengine最大的优势之一,就是写入速度——这是由于TDengine独特设计的

大家都听过这样的一句话:在物联网大数据的场景之下,TDengine最大的优势之一,就是写入速度——这是由于TDengine独特设计的成果。但是,一些用户在初次使用TDengine的时候会觉得写入性能并没有达到自己的预期。这些用户中,有的是直接使用TDengine的服务端,有的是使用了TDengine的客户端,还有的用户使用各种不同的连接器,可以说是形形色色不一而同。

那么——究竟要如何解决这些种类繁多的写入“慢”呢?我们提倡的思路就是——在确保服务端本身的参数和配置已经调整到最优的情况下,逐层向外排查硬件软件网络等因素。

对于通过连接器使用TDengine的用户来说,由于涉及了更多的模块介入以及网络问题,遇到性能问题要稍微麻烦一些。但即便如此,也要对数据库本身的做好性能相关的配置。而在此之前,用“我的xxxx连接器写数据特别慢”是不精准且不利于排查问题的。

所以不论你的场景多么复杂,我们都要首先去服务端检测TDengine的性能。而最省时高效的方法就是使用官方的工具taosdemo观察写入速度是否大致相同。这样做的好处是,可以在第一时间定位问题是否出现在数据库服务端本身。然后,我们就可以针对性地排查其余因素。比如服务端与客户端的网络通信,客户端内部是否异常。

taosdemo的具体使用方式可以通过使用“taosdemo --help”来了解,这个工具可以通过设置表数量、表行数、数据类型、单批插入行数,甚至模拟乱序写入等高级功能来模拟出你在工作使用中遇到的类似场景。跑起来后,taosdemo会自动生成数据完成写入,并在最后给出性能数据。

如果在使用taosdemo依然性能很慢的话,我们就可以做如下优化了:

1. 要提高写入效率,不能一次insert只写入一条记录,那样将是对资源的浪费。建议一条SQL语句写入多条记录,一次写入的记录条数越多,插入效率就越高。典型的情况是,一条SQL写入多个表各一条记录,如:insert into tb1 values(....) tb2 values(....) tb3 values(...)。但一条记录不能超过16K,一条SQL语句总长度不能超过64K(可通过参数maxSQLLength配置,最大可配置为1M,具体内容官方文档可查)。在使用taosdemo模拟的时候,可以通过-r参数来指定单次insert的写入行数,但是要注意计算SQL长度不要超过maxSQLLength。

注:当前最新的版本(2.1.0)里taosdemo的默认maxSQLLength已经为1MB,无需自己调整。

2.TDengine支持多线程同时写入,要进一步提高写入速度,一个12核CPU的客户端可以打开20个以上的线程同时写。但线程数达到一定数量后,速度就无法再提高,甚至还会下降,因为线程切频繁切换,带来额外开销。在使用taosdemo模拟的时候,线程数可以通过-T来指定,一般为cpu核数或二倍核数为最佳。

3. 在大量数据涌入内存等待落盘的时候,vnode虚拟数据节点的内存大小设置就显得尤为重要。cache和blocks这两个参数分别代表着内存块的大小和块数,他们的乘积便是vnode的预留内存。对于很多场景,默认的blocks数量是不够的。当写入缓存不够时,数据不能一次落盘,将会被写入.last临时文件,客观上增加磁盘的IO操作。这就需要根据你的场景酌情增加这个参数的值(3的倍数),在观察写入速度是否提升的同时,观察内存是否为性能瓶颈且保持在一个安全的使用范围内,直到找到最优解。

点击这里,查看taosdemo的使用手册。

在这个过程中,大家要不停地控制变量,观察自己的性能瓶颈出现在哪个环节。是预分配的内存不足,还是操作系统内存不足,抑或是CPU吃光,还是硬盘读写极限,然后做一个针对性的调整。

这样调整过后,对于一个直接使用TDengine服务端的用户来讲,基本就算是足够了。值得一提的是,大家不用过于专注于TDengine每秒写了多少行。因为每行有多少列(测点)和每一列(测点)的数据类型都是不固定的。

而对于使用连接器或客户端的用户来说,如果以上操作还没有解决您的写入性能问题,接下来我们再来排查网络、客户端、应用层面的因素。

由于服务端依靠网络和应用或客户端连接,所以网络问题是性能问题上不可忽视的环节。这里可以给出一个很典型的代表案例:

某用户在使用C接口插入数据的时候曾遇到这样这样的情况: 插入速度时快时慢,整体上比预期速度慢了不少。

于是,我们一起配置好了内存,线程数和单条SQL写入行数。可是在那之后,问题却依然存在。所以我们又一起看了日志发现了一些关于网络通信的告警提示,再结合服务器的监控数据,我们初步诊断写入很慢的原因是网络方面的路由阻塞。之后,该用户便重新搭建了网络拓扑只使用本地虚拟机组成局域网,问题便消失了。

另外,由于TDengine的客户端功能很多(负责获取并缓存元数据;将插入、查询等请求转发到正确的数据节点;在把结果返回给应用时,还需要负责最后一级的聚合、排序、过滤等操作)所以很多时候,TDengine的性能问题并不是出在服务端而是客户端。当你发现你的性能迟迟上不去的时候,去看一下客户端服务器的后台,兴许会有惊人的发现。万万没想到——客户端也会成为写入性能的瓶颈。这个时候,就需要你酌情增加客户端服务器性能或者数量了。

最后,连接器由于在逻辑上是很薄的一层,所以它的性能通常是受相关语言自身特性影响,排除遇到bug的情况下,一般是可以认为是没有优化空间的,比如:Java就是会比C慢一些。

OK,大概就是这样了,读到这里的用户应该对于TDengine的写入性能优化已经有了一个初步的轮廓。这样一来,日后即便是需要官方的技术支持也能做到精准提问,这样对双方都将会是一种非常愉快的体验。对于很多社区版TDengine的新用户来说,由于工作时间紧迫或者是其他原因,会导致大家没有耐心去一步一步地阅读文档了解产品。

在这个时候,这篇文章就能够发挥它该有的作用。


推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • TDengineJavaConnector简体中文|English简体中文taos-jdbcdriver是TDengine的官方Java语言连接器,Java开发人员可以通过它开发存 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 网卡工作原理及网络知识分享
    本文介绍了网卡的工作原理,包括CSMA/CD、ARP欺骗等网络知识。网卡是负责整台计算机的网络通信,没有它,计算机将成为信息孤岛。文章通过一个对话的形式,生动形象地讲述了网卡的工作原理,并介绍了集线器Hub时代的网络构成。对于想学习网络知识的读者来说,本文是一篇不错的参考资料。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • Hadoop or TDengine,如何做物联网大数据平台的选型?
    Hadoop or TDengine,如何做物联网大数据平台的选型? ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
author-avatar
七彩咩_131
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有