前言
性能是用户在抉择和应用时序数据库时十分关注的一个点。
为了精确体现TDengine的性能数据,咱们策动了《TDengine和InfluxDB的性能比照》系列测试报告。
“一言不合上数据”,明天咱们就先来分享一下两款数据库写入性能的比照。
为了更加具备说服力,本次的测试是基于InfluxDB此前与Graphite的性能比照中应用过的场景和数据集的。(https://www.influxdata.com/blog/influxdb-outperforms-graphite-in-time-series-data-metrics-benchmark/)
通过多方筹备与重复测试后,咱们得出的论断是:
1.在InfluxDB公布的本人最优的条件下,TDengine的写入速度是它的2倍。
2.当设施数放大到1000的时候,TDengine的写入速度是InfluxDB的5.2倍。
此外,除了给出测试后果,咱们还有一个小指标——那就是依照文中的步骤和配置,所有浏览本文的开发人员或者架构师都能够复现出同样的过程与后果。咱们认为,只有通过这样得来的测试报告才是最有价值的测试报告。
注释
InfluxDB是一个用Go语言编写的开源时序数据库。其外围是一个自定义构建的存储引擎,它针对工夫序列数据进行了优化,是目前最为风行的工夫序列数据库,在DB-Engines的时序数据库榜单中稳居第一。
TDengine是一款集成了音讯队列,数据库,流式计算等性能的物联网大数据平台。该产品不依赖任何开源或第三方软件,领有齐全自主知识产权,具备高性能、高牢靠、可伸缩、零治理、简略易学等技术特点。和InfluxDB相比,TDengine是以后时序数据库畛域中一匹势头正劲的黑马。
接下来,咱们正式进入测试环节。
一. 根底信息如下:
本次测试应用的数据集是为DevOps监控指标案例建模的数据集。在这个场景中,一组服务器须要定期报告零碎和应用程序的指标,具体实现是:每10秒在一台服务器上的9个子系统(CPU、内存、磁盘、磁盘I/O、内核、网络、Redis、PostgreSQL和Nginx)上采样100个值。为了更好的实现要害指标的比照,在与Graphite的该次比照中,InfluxDB抉择了一个周期为24小时,设施为100台的设定。因而,本次的TDengine和InfluxDB比照测试也是从新应用了这个绝对适中的部署。
重要参数如下图,在上文链接中均可见:
二. 环境筹备
为了不便大家复现,咱们所有的测试都是在运行Ubuntu 20.10的两台azure虚拟机上进行的,配置如下:
规范 E16as_v4 ©AMD EPYC 7452(32-Core Processor 2345.608 MHz,16vCPU, 128GB RAM, 5000 IOPS SSD 1024GB) 用于数据库服务端。规范 F8s_v2 instance type ©Intel(R) Xeon(R) Platinum 8272CL (2.60GHz ,8vCPU,16 GB RAM)用于数据库客户端。
值得注意的是尽管下面服务端CPU显示为32核,然而云服务只分给16个processor。
三. 具体测试方法与步骤:
咱们只有依照如下形式操作便可复现本次测试后果:
1.整体规划:
服务端机器须要装置Influxdb和TDengine服务端;客户端机器须要装置TDengine客户端(版本同为2.0.18)和go语言环境,以及从github上下载性能测试脚本并运行。
2.装置筹备:
1) TDengine装置形式(蕴含客户端):
A. TDengine安装包下载
B. TDengine装置步骤
2) Influxdb装置形式:
Influxdb安装包下载以及装置步骤
3) go1.装置形式:
wget https://studygolang.com/dl/golang/go1.16.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.16.linux-amd64.tar.gz
增加环境变量/etc/profile export PATH=$PATH:/usr/local/go/bin
source /etc/profile
部署完TDengine、InfluxDB与Go语言环境,确保两台服务器的数据库连贯失常应用失常(建库删库写入查问性能均需测试,建库之后立刻删除,如有问题立即排查,为确保权限问题不打搅环境测试,能够全程应用root用户)
此外,在测试中应该留神以下几点:
1)fsync的设置要放弃同步,InfluxDB默认是无延时的fsync,须要批改TDengine的这两个参数:walLevel=2 ,fsync=0能力达到雷同的配置环境。后续的所有测试均是在这个设置条件下实现。
2)TDengine的客户端要把maxSQLLength开到最大1048576。
3.从github取下代码:
su - rootmkdir /comparisonscd /comparisonsgit clone https://github.com/taosdata/timeseriesdatabase-comparisons
4.编译筹备:
1)cd /comparisons/timeseriesdatabase-comparisons,而后删除外面的go.mod和go.sum文件2)执行 go mod init github.com/taosdata/timeseriesdatabase-comparisons3)执行如下命令装置依赖包:go get github.com/golang/protobuf/protogo get github.com/google/flatbuffers/gogo get github.com/pelletier/go-tomlgo get github.com/pkg/profilego get github.com/valyala/fasthttp
最初看到新的go.sum和go.mod文件后,能够持续操作。
5.编译阶段:
mkdir /comparisons/timeseriesdatabase-comparisons/build/tsdbcompare/bin咱们写入须要3个程序,别离是bulk_data_gen、bulk_load_influx以及bulk_load_tdengine。下载失去代码后,别离进入相应目录执行编译等如下命令:cd /comparisons/timeseriesdatabase-comparisons/cmd/bulk_data_gen ;go build ;cp bulk_data_gen ../../build/tsdbcompare/bincd ../bulk_load_influx;go build ;cp bulk_load_influx ../../build/tsdbcompare/bincd ../bulk_load_tdengine;go build ; cp bulk_load_tdengine ../../build/tsdbcompare/bin
(留神:编译bulk_load_tdengine之前要记得装置TDengine客户端)
6.批改脚本:
批改/comparisons/timeseriesdatabase-comparisons/build/tsdbcompare/write_to_server.sh, 把add='tdvs',批改为您选用的数据库服务端hostname。
而后批改如下四行命令,将原有目录替换为本人数据库的文件目录所在(通常TDengine为/var/lib/taos,Influxdb为/var/lib/influxdb):
rm -rf /mnt/lib/taos/* -> rm -rf /var/lib/taos/rm -rf /mnt/lib/influxdb/* ->rm -rf /var/lib/influxdb/*TDDISK=`ssh root@$add "du -sh /mnt/lib/taos/vnode | cut -d ' ' -f 1 " `-> TDDISK=`ssh root@$add "du -sh /var/lib/taos/vnode | cut -d ' ' -f 1 " `IFDISK=`ssh root@$add "du -sh /mnt/lib/influxdb/data | cut -d ' ' -f 1" `-> IFDISK=`ssh root@$add "du -sh /var/lib/influxdb/data | cut -d ' ' -f 1" `
登记掉:curl "http://$add:8086/query?q=drop%20database%20benchmark_db" -X POST这一行后面的#。
7.运行脚本复现测试后果:
cd /comparisons/timeseriesdatabase-comparisons/build/tsdbcompare/./loop_scale_to_server.sh
(留神:此脚本封装了数据的生成与写入过程,有趣味的读者能够自行浏览。如果遇到烦扰因素导致写入失败,能够手动传入参数再次执行失去测试后果。如write_to_server.sh -b 5000 -w 100 -g 0 -s 100。具体参数含意能够通过“/comparison/timeseriesdatabase-comparisons/build/tsdbcompare/write_to_server.sh -h得悉)
四. 理论测量数据
通过一番测试后,咱们制作了这样一张表格。通过它咱们能够分明地看到:不论是单线程还是多线程,不论是小批次还是大批次,TDengine都始终稳稳放弃着2倍左右的速度劣势。
其中5000batch,16wokers的场景下(InfluxDB与Graphite的比照报告中的测试项),influxDB耗时35.04秒,而TDengine耗时仅17.92秒。
此外,InfluxDB仅仅做了100台设施和900个监测点的测试。然而于咱们看来,理论利用场景中的设施数量和监测点数目肯定是远远超过这个数字的。于是咱们调整了脚本参数,从100个设施逐渐减少到200,400,600,800,1000,通过将单方数据量的同比例放大,从而得出了更多接入设施状况下的写入比照后果。
(数据表格附在注释后。且因为所耗时间切实过长,所以1000台设施单线程写入1行的后果没有写入表格,不影响理论后果)后果是,在成倍地减少设施数后,TDengine仍然放弃着稳稳地当先,并且将劣势持续扩充。
论断
以后的测试后果曾经比拟无力地阐明了前言中的两点论断:
1.在InfluxDB公布的本人最优的条件下,TDengine的写入速度是它的两倍。
2.当设施数放大到1000的时候,TDengine的写入速度是InfluxDB的5.2倍。
因为5.2倍又恰好是本次测试单方的性能差距最高点,因而咱们毫不犹豫地决定应用该测试条件(5000batch size,16workers)作出两张以设施台数为横轴的折线图,因为这将极具代表性。(图一代表单方写入雷同数据量的所耗秒数,图二代表单方每秒写入的行数。)
这两张图充分说明了一点:设施数越多,数据量越大,TDengine的劣势就越显著,正如成语有云——韩信将兵,多多益善。
而思考到本次性能测试比照的接口类型并不统一,TDengine采纳的是cgo接口而InfluxDB为rest,性能上会有大量浮动,绝不会从根本上扭转后果,而后续其余接口以及场景的测试咱们也会陆续推出。
如果您对更多细节感兴趣,能够自行应用上文的测试代码自行操作复现,咱们将非常欢迎您贵重的倡议。
最初附上测试数据全记录: