看过TDengine介绍的都知道,TDengine写入性能很好。
没看过介绍的看 官网。
但是大部分人都不清楚TDengine到底能写到什么性能?自己的系统是不是还有提升性能的空间?
其实我也不知道。
不过这不妨碍我们根据硬件性能和TDengine的工作原理对其写入性能进行估算。
先上一张TDengine 架构图【图片来自TDengine官网】
根据上图我们可以大概看出会产生性能瓶颈的地方:
步骤1:数据从App传输到TDengine,瓶颈在网络带宽、网卡吞吐性能;
步骤2:数据写入WAL,瓶颈在磁盘IO;
步骤3:数据同步到slave,瓶颈在网络带宽和网卡吞吐性能【由于默认是异步模式,很难成为整体的瓶颈】;
步骤4:数据写入缓存,然后写入磁盘【此步骤会对数据进行压缩,主要瓶颈在CPU和内存大小】;
步骤5:返回操作结果,由于返回值比较小,因此不存在瓶颈。
综述所述,从硬件性能上考虑,最容易产生瓶颈的是网络带宽和磁盘IO。
由于网络传输的数据基本上是明文,同时WAL也没有对数据进行压缩。那么假设原始的数据量为A,那么网络传输的数据B则接近略大于A【加上网络包头和SQL语法】,写入WAL的数据C接近A,略小于B【对网络包进行了处理】。
为了方便计算则取A=B=C。
那么写入速度=min{A/带宽, A/磁盘IO}
举例说明:
千兆网络+机械硬盘+超NB内存和CPU 能达到什么写入速度?
千兆网络实际传输速度100MB/s
机械硬盘写入速度也差不多100MB/s
那么TDengine的写入速度应该在100MB/s 左右【不考虑CPU、内存的影响】
那么上述环境更换成SSD硬盘会提升写入性能吗?
显然不会,因为网络会成为瓶颈。
以上描述只适用于单节点环境,如何是集群环境,则情况更为复杂。
例如:
- 如果副本数为2,那么网络中除了App传输的数据外,还会有集群间同步的数据,数据量基本上翻一番。
- 如果App集中写入到集群中的某一台,那么多节点并不能带来性能的翻倍。
- 如果数据集中写入某个表,那么CPU个数再多,也没啥效果。
………………
拓展2:如果内存不足会怎样?
官网上有如下描述:
TDengine默认walLevel 是1,也就是说WAL会先写入操作系统缓存,然后再写入磁盘。
那么如果内存不足时会发生什么?
阻塞!!
写入会被阻塞。
见 一张图解释dirty_background_ratio与dirty_ratio
那么内存需要多少才够??
有空再说。



