基于 TSBS 标准数据集,TDengine Database 团队对时序数据库(Time Series Database,TSDB) TimescaleDB 和 TDengine 针对 TSBS 指定的 DevOps 中 cpu-only 五个场景对查询性能进行了对比测试。
点击这里,查看相关背景介绍及软件配置。
在场景一(只包含 4 天的数据)与场景二的 15 个不同类型的查询中,TDengine 的查询平均响应时间全面优于 TimescaleDB,而且在复杂查询上优势更为明显,同时具有最小的计算资源开销。相对于 TimeScaleDB,场景一,TDengine 查询性能是其 1.1 ~ 28.6 倍,平均 7.6 倍,场景二,TDengine查询性能是其 1.2 ~ 24.6 倍,平均 7.7 倍。
在查询性能评估部分,我们使用场景一(只包含 4 天数据,这个修改与[7]中要求一致)和场景二作为基准数据集。在查询性能评估之前,对于 TimescaleDB, 我们采用[7]中推荐配置,设置为 8 个 Chunk ,以确保其充分发挥查询性能。在整个查询对比中,TDengine 数据库的虚拟节点数量(vnodes)保持为默认的 6 个,其他的数据库参数配置为默认值。
1 4,000 devices × 10 metrics查询性能对比
由于部分类型(分类标准参见[7] )单次查询响应时间非常短,为了更加准确地测量每个查询场景的较为稳定的响应时间,我们将单个查询运行次数提升到 5,000 次,然后使用 TSBS 自动统计并输出结果,最后结果是 5,000 次查询的算数平均值,使用并发客户端 Workers 数量为 8。首先我们提供场景二 (4,000 设备)的查询性能对比结果。
查询分类 | TDengine | TimescaleDB | TimescaleDB/TDengine | |
---|---|---|---|---|
Simple Rollups | single-groupby-1-1-1 | 0.94 | 3.27 | 347.87% |
single-groupby-1-1-12 | 1.92 | 5.07 | 264.06% | |
single-groupby-1-8-1 | 2.09 | 4.56 | 218.18% | |
single-groupby-5-1-1 | 1.08 | 3.34 | 309.26% | |
single-groupby-5-1-12 | 3.00 | 7.02 | 234.00% | |
single-groupby-5-8-1 | 2.60 | 9.6 | 369.23% | |
Aggregates | cpu-max-all-1 | 1.30 | 5.54 | 426.15% |
cpu-max-all-8 | 3.36 | 23.72 | 705.95% | |
Double-Rollups | double-groupby-1 | 266.69 | 5467.91 | 2050.29% |
double-groupby-5 | 446.23 | 10984.63 | 2461.65% | |
double-groupby-all | 686.42 | 16660.7 | 2427.19% | |
Thresholds | high-cpu-1 | 2.23 | 4.05 | 181.61% |
high-cpu-all | 3,508.00 | 4328.64 | 123.39% | |
Complex Queries | groupby-orderby-limit | 1,527.02 | 12784.92 | 837.25% |
lastpoint | 133.13 | 755.37 | 567.39% |
下面我们对每个查询结果做一定的分析说明:
由于 Simple Rollups 的整体查询响应时间非常短,制约查询响应时间主体因素并不是查询涉及的数据规模,即这种类型查询的瓶颈并不是数据规模。但是 TDengine 仍然在所有类型的查询响应时间上优于 TimescaleDB,具体的数值比较请参见表 1 中的详细数据表格。
在 Aggregates 类型的查询中,我们看到 TDengine 查询性能相比于 TimescaleDB 有比较大的优势,TDengine 在 cpu-max-all-8 查询性能是 TimescaleDB 的 6 倍。
在 Double-rollups 类型查询中, TDengine 展现出巨大的性能优势,其查询响应时间来度量,double-groupby-5 和 double-groupby-all 的查询性能是 TimescaleDB 的 24 倍。
如图 4、图 5 所示 threshold 类型的查询,TDengine 的查询响应时间均显著低于 TimescaleDB。在 high-cpu-all 类型的查询上,TDengine 的性能是 TimescaleDB 的 1.23 倍。
对于 Complex-queries 类型的查询,TDengine 两个查询均大幅领先 TimescaleDB。在 lastpoint 查询中,查询性能是 TimescaleDB 的 5 倍。在 groupby-orderby-limit 场景中查询性能是 TimescaleDB的 8 倍。在时间窗口聚合的查询过程中,TimescaleDB 针对规模较大的数据集其查询性能不佳(double rollups 类型查询),对于 groupby-orderby-limit 的查询,其性能上表现同样不是太好。
2 资源开销对比
由于部分查询持续时间特别短,并不能完整地看到查询过程中服务器的 IO/CPU/网络情况。我们针对场景二以 Double rollups 类别中的 double-groupby-5 查询为例,执行 1,000 次查询,记录整个过程中 TDengine、TimescaleDB 两个软件系统在查询执行的整个过程中服务器 CPU、内存、网络的开销进行对比。
如图 7 可以看到,两个系统在整个查询过程中 CPU 的使用均较为平稳。TDengine 在查询过程中整体 CPU 占用约 80%, 使用的 CPU 资源最高,TimescaleDB 在查询过程中瞬时 CPU 占用约 38%。由于 TDengine 完成全部查询的时间仅 TimescaleDB 1/20,虽然 CPU 稳定值是 TimescaleDB 的 2 倍多,整体的 CPU 计算时间消耗只有其 1/10 。
服务器内存状况
如图 8 所示,在整个查询过程中,TDengine 内存维持了一个相对平稳的状态。TimescaleDB 在整个查询过程中内存呈现增加的状态,查询完成后即恢复到初始状态。
服务器网络带宽
图 9 展示了查询过程中服务器端上行和下行的网络带宽情况,负载状况基本上和 CPU 状况相似。TDengine 网络带宽开销较高,因为在最短的时间内就完成了全部查询,需要将查询结果返回给客户端。TimescaleDB 开销较低,但持续时间长。
3 100 devices × 10 metrics 查询性能对比
对于场景一(100 devices x 10 metrics),TSBS 的 15 个查询对比结果如下:
查询分类 | TDengine | TimescaleDB | TimescaleDB/TDengine | |
---|---|---|---|---|
Simple Rollups | single-groupby-1-1-1 | 0.91 | 2.93 | 321.98% |
single-groupby-1-1-12 | 1.83 | 4.87 | 266.12% | |
single-groupby-1-8-1 | 2.09 | 4.30 | 205.74% | |
single-groupby-5-1-1 | 1.03 | 3.19 | 309.71% | |
single-groupby-5-1-12 | 2.94 | 6.38 | 217.01% | |
single-groupby-5-8-1 | 2.63 | 5.91 | 224.71% | |
Aggregates | cpu-max-all-1 | 1.27 | 5.55 | 437.01% |
cpu-max-all-8 | 3.46 | 22.83 | 659.83% | |
Double-Rollups | double-groupby-1 | 7.79 | 116.66 | 1497.56% |
double-groupby-5 | 12.10 | 346.48 | 2863.47% | |
double-groupby-all | 17.31 | 489.04 | 2825.19% | |
Thresholds | high-cpu-1 | 2.05 | 3.92 | 191.22% |
high-cpu-all | 96.75 | 104.68 | 108.20% | |
Complex Queries | groupby-orderby-limit | 47.48 | 367.40 | 773.80% |
lastpoint | 3.95 | 17.64 | 446.58% |
如表 2 所示,在更小规模的数据集(100设备)上的查询对比可以看到,整体上 TDengine 同样展现出极好的性能,在全部的查询语句中全面优于 TimescaleDB,部分查询性能超过 TimescaleDB 28 倍。
>> TimescaleDB vs. TDengine 其他性能对比测试具体结果与分析