Apache IoTDB 系列教程-6:性能优化(0.8-0.10)

2023-05-16

 

今天的内容包括建模优化、读写性能优化,会涉及一些简单的原理介绍。主要面向 0.8 - 0.10 版本。

正文 3754 字,预计阅读时间 10 分钟。

建模指南

关于存储组

现在每个存储组是一个相对独立的引擎,而且读写锁是存储组级别的。因此把存储组从1改到10,读写基本能增速8倍。单个 IoTDB 实例推荐设置 CPU 核数个存储组。存储组越多,并行度就越高。我们之后打算把锁粒度下放到设备层。

设备

设备这个概念没有在 SQL 语句里显示的定义出来,而是在服务器端处理时候默认将倒数第二层设置为设备,导致大家容易忽略这个概念。先说一下设备影响什么。

(1)区分顺序数据 和 乱序数据是以设备为粒度的。举个例子,假如一个设备在内存里写了时间戳 1-10 的数据(不论写哪些测点,时间戳都会算到这个设备头上),落盘了,再写时间戳<=10 的数据,这些数据就会被当做乱序数据缓存并落盘。

(2)设备粒度的时间范围索引。对于每个 TsFile 文件,会构造设备粒度的索引在内存里,假如所有设备都活跃,N 个 TsFile,D 个设备,就有 N*D 条索引。百万级设备的索引内存会吃不消。这个东西我们会在一两个版本内改掉。

再说一下怎么设计建模来控制设备数。对于实际应用设备和传感器层次比较简单的情况比较好说,设备下直接是传感器层,一般不会建错。对于设备下有多层结构的就要注意了。

比如我一个设备下有10个传感器(s1,s2,...,s10),每个传感器采集10个时间序列的数据(f1,f2,...f10)。这时候很容易建成 root.xxx.device.s1.f1 这种。当你建成这种时候,你以为的 device 就不再是你以为的 device 了,实际的device 变成了 root.xxx.device.s1 。 实际 device 数量就是你以为的 10 倍了。

怎么办嘞,如果设备下的子设备不多,这样建模也没啥问题,只要你心里清楚系统中实际有多少个设备就行,这样沟通不会出现偏差,便于以后排查问题。

如果子设备非常多,可以把设备后的那几层压成一层,比如 root.xxx.device.s1_f1 。由于我们是以 . 作为分隔符的,这样 s1_f1 就变成 1 层了。 实际的设备还是 root.xxx.device。

Measurement 定义

Measurement 也就是最后一层的测点。假如一个测点是 INT32 或者 INT64 类型的,而且大部分时间这个数据的值都一样,没什么变化,这时候用 RLE 编码就很好。可以大大节省磁盘空间,当然刷盘速度也会变快。压缩方式开着 SNAPPY 就挺好。

Tag & Attribute

0.10.0 引入的这两个概念,容易分不清这两个有啥区别。 虽然都是 key-value 类型的属性。但是 Tag 是可以反向查询时间序列的元数据的,假如有个 tag  的 key 是 owner,就可以用 show timeseries where owner=Thanos 查灭霸拥有的时间序列。Tag 常驻内存,有Tag到时间序列的索引。

Attribute 就是普通属性了,比如有个属性是 description="this is my series"。这些属性只能是给定时间序列的路径顺带展示一下,辅助人查看的。

因此,要根据实际需求进行区分,那些需要做反向查询的属性,就建成 tag,其他的就搞成 attribute 就行了。 

读写优化

读和写关系密切,数据的写入和参数配置会影响查询性能。

写入接口

以 0.10 为例,先同类比较,insertRecords 接口肯定比 insertRecord 接口要快,这个类似 JDBC 的 executeBatch 和 execute 的区别,节省了网络通信次数。同理,insertTablets 比 insertTablet 要快,createMultiTimeseries 也比 createTimeseries 要快。

进一步,insertRecords 方法我们提供了两种,一种是传 Object 的 value,一种是传 String 的 value。如果客户端能获取 value 的类型,建议用 Object 的,会比 String 的快 25% 左右。

跨类比较的话,如果不考虑客户端做格式转化的耗时,insertTablet 比 insertRecords 要快很多,可能 8 倍以上,节省了很多对象封装的耗时,batch size 1000左右就可以。

insertTablet 这个接口默认是没排序的,如果你能保证一个 Tablet 数据的时间戳是非递减的,那就可以多加一个 sorted 为 true 的参数。就节省了客户端的排序。

在统计耗时的时候,还需要注意客户端做格式转化的耗时,可以把接口参数构造的时间和执行的时间分开统计。

查询接口

查询接口比较简单,Session 默认的 hasNext 和 next 会返回 RowRecord 结构,这个结构不一定大家都需要,可以用 SessionDataSet 的 iterator 得到一个迭代器,然后通过类似 JDBC 的接口去得到原始数据,避免很多没用的对象生成。

顺序写入

对于时序数据库,时序是一个很重要的概念,最好不要乱来。IoTDB 支持数据的乱序写入,但是乱序数据会影响查询性能,主要是对于聚合查询,原理是乱序数据会让预计算的统计信息失效,把聚合查询降维打击到读原始数据。

正常情况下,有个几倍的乱序都没问题,但是如果往一个时间段写入了过多(几万倍)的乱序数据,查询时候有可能爆内存。举个例子,内存缓冲区写了时间戳1-10的数据落盘了,然后又写了 9999 遍 1-10 的缓冲区,这样磁盘上就有 1 万个时间戳是 1-10 的数据块。查询时候需要将 1万 个数据块都读出来进行合并,内存占用就比较大了。

面对这种场景,我们会后台做数据整理来处理乱序(在0.9引入的merge,但是0.9版本有bug,0.10修掉了,但是先默认关掉了,会在0.11重新开放merge),但是如果能在客户端避免乱序,就尽量写入的时候避免掉。一个设备就按递增的顺序写入。

如果前边接了 kafka,最好注意一下,把设备 id 作为分区粒度,这样一个设备的数据都会发送到一个分区里,消费的时候同一个分区也能保证顺序。

内存缓冲区

先介绍一下每个序列在内存里能缓存多少个点的怎么算的,用 memtable 大小除以序列数,再除以每个点的大小,比如long类型就是 16字节(8字节时间戳,8字节值),float是12字节。

memtable 的大小可以从日志里看到,搜 reaches,大概日志就是 the memtable size xxx reaches the threshold。如果配置文件里的 enable_parameter_adapter 没有改为 false,这个 memtable 大小就不固定,随着注册的序列数量调整的。

内存缓冲区在一定范围内尽可能大有利于读写。平均每个序列能缓冲100万点以下是比较好的。但是不建议太大,查询时候会临时排序,如果内存中数据点过多,比如千万级,查询时候内存排序会占个十几秒。

为了避免这个问题,0.10.0 里加了个参数,avg_series_point_number_threshold ,默认是 10000,也就是内存缓冲区中每个序列最多缓存这么多点就会刷盘,这个默认参数没给好,可以改成50万或者100万。

memtable_size_threshold 这个参数越大,写入速度快,一般在几百M到一两G左右。不要设置的过小,比如几M,会严重影响写入速度。在设置这个参数时候需要注意不要超内存限制,调这个参数之前需要保证 enable_parameter_adapter 改为 false。

多数据目录

数据库的瓶颈在磁盘IO,简单的提升磁盘IO能力的就是配置多盘。IoTDB 的数据目录可以在 data_dirs 参数配置,用逗号分隔多个目录。可以每块盘一个目录。在写数据的时候会到这几个盘里找最空闲的写。

客户端优化

刚才说了存储组级别的锁,对于同一个存储组的N个写线程,这N个写线程都会抢一把锁,一个存储组对应不超过50个客户端比较好,写线程过多会导致过多的锁竞争。

线程池 SessionPool 的容量,一般搞个服务器 CPU 核数就可以了,不要过多。

客户端的内存,数据的生产和消费速率也可以监控起来,避免提交的任务积压过多,如果客户端内存满了,会出现一个现象:客户端发送请求到服务器,服务器执行和返回很快,但是客户端接收结果会很慢。

容易爆内存的点

select * from root 这个语句在序列过多时候最好不要做,这个操作会把整个库当做一张表,一下查出来所有列的一批数据,容易爆内存,我们会在0.11版本加个检查,及时拒绝。

show timeseries 在 0.10 及以前的版本会把系统所有序列在内存里拷贝一遍传给客户端,如果序列过多,最好指定前缀做个过滤。或者 show child paths 一层一层往下查。

时间序列过多(亿级),元数据可能爆内存,可以按照一条时间序列 200字节估计一下,大概1千万序列会占2G元数据(就是那个元数据树)。

总结

数据库前期需要比较多的手动调优,现在的自动调优工具还有待完善,我们的目标是越简单越好,0.11 版本会完善内存和参数配置。今天内容比较多,之后想到什么再出续集!

欢迎关注,转发,给 github 点 star!

https://github.com/apache/incubator-iotdb/tree/master

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache IoTDB 系列教程-6:性能优化(0.8-0.10) 的相关文章

  • Mac外接键盘ikbc win键无法使用问题

    ikbc的型号 是c87 青轴的 之前win键是可以用的 xff0c 今天发现不能用了 xff0c 查了一下 xff0c 原来是无意中按错被锁住了 按右下边的Fn 43 右上 PrtSc 即可解锁 又可以愉快地使用win键敲代码了
  • ros学习(七):sensor_msgs 消息类型

    一 sensor msgs Imu sensor msgs Imu Documentation http docs ros org en api sensor msgs html msg Imu html c 43 43 使用时头文件为 x
  • np.random.choice的用法

    import numpy as np 参数意思分别 是从a 中以概率P xff0c 随机选择3个 p没有指定的时候相当于是一致的分布 a1 61 np random choice a 61 5 size 61 3 replace 61 Fa
  • np.clip()的用法

    一时间忘了 xff0c 就又看了一下API 是这样说的 numpy clip a a min a max out 61 None source Clip limit the values in an array Given an inter
  • np.roll的用法

    coding UTF 8 import numpy as np np roll a shift axis 61 None 意思是将a xff0c 沿着axis的方向 xff0c 滚动shift长度 example1 a 61 np aran
  • 为什么vmware中的ctrl+alt+F1~F7不能用?

    这个总是确实困挠了我好久 xff0c 也花了我大把大把的时间去弄 xff0c 终于今天搞定了 xff0c 但是其实就2分钟就能搞定的事情 所以在此作总结 希望能帮助其他人 我的目的是想用Mac装上Vmware xff0c 然后在里面下ten
  • Squeeze-and-Excitation Networks 的理解

    SE Block 主要是考虑到了不同通道之间所占的重要性可能不一样 xff0c 而以前的网络中并没有考虑到这一点 xff0c 而是把所有通道的重要性当成一样来处理的 不同的通道的重要性是通过学到的一组权值来scale的 xff0c 相当于经
  • Gitee同步GitHub仓库如何操作

    最近 xff0c 许多开发者在进行私有仓库同步时 xff0c 会发现无法在 Gitee 通过同步功能拉取 GitHub 上的代码 xff0c 产生该问题的原因是 GitHub 从 2021 年 8 月 14 日后 xff0c 使用 Git
  • AUTOSAR ComM模块介绍

    AUTOSAR ComM模块介绍 Autosar ComM概述 Autosar ComM 全称是 Autosar Communication Manager 顾名思义就是用来管理通讯的 ComM 模块位于 BSW 中 Systme Serv
  • C语言中__FILE__ __LINE__ #line的用法

    C语言中 FILE LINE line的用法 C语言中 FILE 用于指示本行语句所在源文件的文件名 例如该行语句位于main c中 xff0c 则 FILE 表示main c C语言中 LINE 用于指示本行语句位于源文件中的位置即行数
  • 【新手向】make工具的使用

    make工具 在了解make工具前我们回顾下gcc编译步骤 1 xff09 预处理 处理与 号相关的代码 gcc E xxx c o xxx i 2 xff09 编译 检查语法错误 xff1b 如果语法有误则报错 xff0c 如果语法没错则
  • [python] python调用C++ 程序

    Python调用C C 43 43 程序的方法 最近写BUG的时候遇到python计算很慢的情况 xff0c 于是调研了一波在python中嵌入C 43 43 程序的方法 xff0c 记录一下 xff0c 便于查询 一般来说在python调
  • 深度学习(三):yolov5环境配置及使用

    目录 0 前言 1 环境配置 1 1 python环境 1 2 官方github的样例 1 2 1 打印检测结果 1 2 2 展示检测结果 2 运用detect py进行检测 2 1 网络摄像头 2 2 将检测过程可视化 3 运用train
  • sensor_data参数校验

    新的 xff1a Akamai sensor data zwl haley的博客 CSDN博客 只说下思路吧 xff0c 毕竟把加密代码公开对别网站不好 如有权益问题可以发私信联系我删除 xff0c 或q 1847858794 如图 xff
  • C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

    Muduo is a multithreaded C 43 43 network library based on the reactor pattern muduo库的介绍就是 xff1a 一个基于reactor反应堆模型的多线程C 43
  • FCT测试

    1 总论 2 启动过程 3 各模块实现 1 总论 FCT 作为 Android 的一个外来测试程序 xff0c 位于源码的 external 文件夹内 xff0c 其目的是作为产品在 PCBA 装配生产线中的一个制程 xff0c 对外围硬件
  • ARM上电启动及Uboot代码分析

    注意 xff1a 由于文档是去年写的 xff0c 内有多个图片 xff0c 上传图片很麻烦 xff08 需要截图另存插入等等 xff09 xff0c 我把文章的PDF版本上传到了CSDN下载资源中 为了给自己赚点积分 xff0c 所以标价2
  • 【解决】缺少libstdc++.so.6库的原因及解决办法

    问题原因 xff1a 系统是64bit xff0c 该库是32bit的 xff0c 在64bit系统上安装32bit库 解决办法 xff1a 1 查看哪个安装包包含该库 xff1a yum provides libstdc 43 43 so
  • 仿真器和模拟器的区别

    仿真器 xff08 emulator xff09 和模拟器 xff08 simulator xff09 是比较容易混淆的概念 xff0c 这两个概念不仅针对计算机体系结构 xff0c 在很多方面都有所应用 xff0c 例如航空模拟器 街机仿
  • Flush-Cache/Page-Lock/Flush-TLB说明

    Flush Cache Page Lock Flush TLB说明 理论上顺序 xff1a 获得页面锁 xff0c 保证后续flush操作完成之前不允许继续读写Flush cacheFlush tlb 以下用numa migrate pag

随机推荐

  • 内核动态补丁(kpatch)及kpatch pushsection popsection previous的解释

    内核动态补丁 xff08 katch xff09 解释 本文阅读体验不好 xff0c 因此做了pdf版本 xff0c 点击下载 xff0c 如果你没有分数 xff0c 可以直接留言找我要pdf版本 内核可以在运行时动态执行补丁中的代码 xf
  • Shell编程:字符串与数值之间的转换与计算

    shell编程往往需要对字符串进行操作 xff0c 有时需要将字符串转为数值 xff0c 并做加减运算 以下介绍将字符串转为数值并进行计算的方法 temp1 61 400d7c echo 16 temp1 43 4 xff08 打印默认是十
  • linux内核代码预处理后便于阅读

    inux 内核庞大而复杂 内核代码阅读的时候 xff0c 有没有遇到因为宏定义或者inline层次太深而不知道到底代码是什么样子 代码预处理可以解决这个难题 平台 xff1a linux 3 4 5 ARM xff0c PC linux上类
  • 深度学习(六):pointnet.pytorch环境配置与学习

    目录 0 前言 0 1 shapenet数据集 1 配置环境 1 1 配置Python环境与安装pytorch 1 2 安装pointnet及其他包与下载数据 2 默认训练 2 1 分类训练train classification 2 1
  • sed在行首(行尾)添加字符串;在某行后添加多行字符串

    sed在行首添加字符串 xff1b sed s xxx 39 filename gt output xff1a 符号代表行首 sed在行尾添加字符串 xff1b sed s string 39 filename gt output xff1
  • 【解决】xterm Xt error: Can't open display: xterm: DISPLAY is not set

    当你运行xterm出现错误如下 xff1a xterm Xt error Can 39 t open display xterm DISPLAY is not set 我的系统centos6 2 解决办法 xff1a 1 首先确定你安装了x
  • 【解决】yum 安装 出错 Error: Protected multilib versions:

    我安装zlib出错 xff1a yum install zlib 1 2 3 29 el6 i686 Error Protected multilib versions zlib 1 2 3 29 el6 i686 61 zlib 1 2
  • 贴一下我的 vimrc 以及 vim 效果

    贴一下我的vimrc 看起来真的很养眼 xff0c 呵呵 这几天一直忙活着配置VIM xff0c 这个编辑器太迷人了 虽然emacs也强大 xff0c 可是仔细想想 xff0c 还是vim的效率高一些 原因如下 xff1a emacs通过
  • vim语法高亮——使自定义类型也能高亮的简单办法

    说明 xff1a 判断是否类型的简单办法 xff0c 就是简单的观察 xff1a 如果该标志符后面有空格 xff0c 空格后又是一个标志符的话 xff0c 在 xff23 xff0f xff23 xff0b xff0b 语言中 xff0c
  • 原创:纠正国人对Linux的误解和错误认识

    错误印象和认识罗列如下 xff0c 一一解释 xff1a 1 linux下的软件太少 回答 xff1a linux 下的软件一点也不少 windows还在娘肚子里的时候 xff0c Unix已经如日中天了 要知道微软公司开发的第一个操作系统
  • 原创:自己写的端口数据转发工具pf (port forwarding)

    看了 子清行 朋友博客里的一篇文章 xff0c 讲述了一个叫 DuplexPipe 的小工具的实现 最开始没怎么懂意思 xff0c 看了他公开的源代码 xff0c 是用java写的 xff0c 一个jar包 可惜我不太会java 因此没法看
  • 又一次被linux的工具震惊了

    前一篇博客还写了自己写的端口转发工具 xff0c 今天偶然在网上看到讲命名管道和netcat配合的用法 xff0c 被彻底雷倒了 原来以为netcat做不到 xff0c 原来是自己想不到 xff0c 而不是netcat做不到 方法如下 xf
  • Ubuntu桌面旋转xrandr

    项目实行过程中 xff0c 设备安装为竖屏模式 xff0c 分辨率由19201080变为10801920 xff1b 最简单实现 xff0c 将桌面系统显示旋转 xff1a xff08 终端命令 xff09 xrandr o left 向左
  • VR应用在直播领域上的实践与探索

    声明 xff1a 本文来自 七牛云主办的架构师实践日 泛娱乐 43 直播技术最佳实践 的演讲内容整理 PPT 速记和现场演讲视频等参见 七牛架构师实践日 官网 嘉宾 xff1a 孙其瑞 xff0c 得图网络CTO 责编 xff1a 钱曙光
  • ubuntu(14):ubuntu16编译move_base报错与解决

    目录 1 Could NOT find OpenVDB missing OPENVDB LOCATION 2 Could not find a package configuration file provided by 34 costma
  • 在CSDN发布博客怎么改变代码块颜色

    第一步 CSDN首页 xff0c 最右侧点击创作中心 第二步 左侧导航栏滑到最下面 xff0c 点击博客设置 第三步 找到代码片样式 xff0c 简单吧 xff08 又水了一篇 xff09
  • 裸机驱动与Linux设备驱动的区别

    裸机驱动一般针对没有操作系统支持的层面 不用考虑操作系统对它的调用 Linux驱动是在裸机驱动基础上 按照一定的规范来实现 虽然实现的都是同一个东西 不过你发现在 Linux驱动 搀杂 了许多维护信息 总之 xff0c Linux设备驱动就
  • 使用2020版IDEA创建Servlet

    使用2020版IDEA创建一个完整的Web项目的整个过程分为四步 第一步 创建一个普通的Java项目 1 打开IDEA xff0c 选择菜单File gt New gt Project 2 选择Java xff0c 以及自己的JDK xff
  • Apache IoTDB 系列教程-5:常见问题汇总(1)

    在过去的一段时间 xff0c 收集了不少大家在使用过程中反馈的问题 xff0c 今天把一些常见问题列出来 xff0c 给更多人提供参考 开了个交流群二维码 xff0c 可以扫码进群 正文 1974 字 xff0c 预计阅读时间 5 分钟 常
  • Apache IoTDB 系列教程-6:性能优化(0.8-0.10)

    今天的内容包括建模优化 读写性能优化 xff0c 会涉及一些简单的原理介绍 主要面向 0 8 0 10 版本 正文 3754 字 xff0c 预计阅读时间 10 分钟 建模指南 关于存储组 现在每个存储组是一个相对独立的引擎 xff0c 而