热门标签 | 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的新用户来说,由于工作时间紧迫或者是其他原因,会导致大家没有耐心去一步一步地阅读文档了解产品。

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


推荐阅读
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
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社区 版权所有