实验目的
- 测试实现ID表前后、不同ID算法下IoTDB的写入性能
- 测试实现ID表前后、不同ID算法下IoTDB的原始数据查询性能
硬件配置
- 系统:4.4.0-186-generic #216-Ubuntu
- CPU:8核,Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
- 内存:16G
实验方法
使用IoTDB benchmark进行写入及查询性能测试,写入使用session insertTable,查询为原始数据查询
实现不同时间序列路径长度的方法为,修改benchmark项目中/core/src/main/java/cn/edu/tsinghua/iotdb/benchmark/conf/Constants.java文件中的如下字段:
public static final String DEVICE_NAME_PREFIX = "l1.l2.l3.l4.l5.d_";
实验配置
- 总设备数:10000
- 每个设备下的点数:100
- 每个Tablet中的行数:100
实验结果
存储组数及并发数:20
写入性能
时间序列路径模板:root.test.g_1.l1.l2.l3.l4.l5.d_1.s_1
吞吐量(points / s) | 吞吐量百分比 | 平均时延(ms) | P95时延(ms) | |
---|---|---|---|---|
IoTDB 0.13 | 15650216.31 | 100 % | 12.40 | 13.61 |
不开启ID表 | 15640592.10 | 99.94 % | 12.44 | 13.68 |
使用Plain ID方法的IoTDB (设备名ID化为原设备名) | 16146229.15 | 103.17 % | 12.05 | 13.22 |
使用SHA256 ID方法的IoTDB (设备名ID化为SHA256值) | 15928384.91 | 101.78 % | 12.74 | 14.42 |
时间序列路径模板:root.test.g_1.d_1.s_1
吞吐量(points / s) | 吞吐量百分比 | 平均时延(ms) | P95时延(ms) | |
---|---|---|---|---|
IoTDB 0.13 | 16439184.13 | 100 % | 11.42 | 12.96 |
不开启ID表 | 16513849.23 | 100.42 % | 11.42 | 13.05 |
使用Plain ID方法的IoTDB (设备名ID化为原设备名) | 16219284.15 | 98.66 % | 12.30 | 13.19 |
使用SHA256 ID方法的IoTDB (设备名ID化为SHA256值) | 16012939.91 | 97.41 % | 12.66 | 14.95 |
查询性能
时间序列路径模板:root.test.g_1.l1.l2.l3.l4.l5.d_1.s_1
吞吐量(points / s) | 吞吐量百分比 | 平均时延(ms) | P95时延(ms) | |
---|---|---|---|---|
IoTDB 0.13 | 3053.98 | 100 % | 2.13 | 9.95 |
不开启ID表 | 3095.78 | 101.38% | 2.11 | 9.13 |
使用Plain ID方法的IoTDB (设备名ID化为原设备名) | 3048.23 | 99.84 % | 2.45 | 9.75 |
使用SHA256 ID方法的IoTDB (设备名ID化为SHA256值) | 3066.15 | 100.41 % | 2.13 | 8.93 |
时间序列路径模板:root.test.g_1.d_1.s_1
吞吐量(points / s) | 吞吐量百分比 | 平均时延(ms) | P95时延(ms) | |
---|---|---|---|---|
IoTDB 0.13 | 3098.29 | 100 % | 2.42 | 9.58 |
不开启ID表 | 3094.19 | 99.87 % | 2.44 | 10.02 |
使用Plain ID方法的IoTDB (设备名ID化为原设备名) | 3109.85 | 100.32 % | 2.43 | 9.98 |
使用SHA256 ID方法的IoTDB (设备名ID化为SHA256值) | 3093.29 | 99.87 % | 2.59 | 10.24 |
存储组数及并发数:200
写入性能
时间序列路径模板:root.test.g_1.l1.l2.l3.l4.l5.d_1.s_1
吞吐量(points / s) | 吞吐量百分比 | 平均时延(ms) | P95时延(ms) | |
---|---|---|---|---|
IoTDB 0.13 | 17399875.14 | 100 % | 108.99 | 208.91 |
不开启ID表 | 17400975.44 | 100 % | 109.24 | 205.49 |
使用Plain ID方法的IoTDB (设备名ID化为原设备名) | 17892831.15 | 102.82 % | 98.34 | 191.58 |
使用SHA256 ID方法的IoTDB (设备名ID化为SHA256值) | 17582939.94 | 101.05 % | 105.25 | 199.19 |
时间序列路径模板:root.test.g_1.d_1.s_1
吞吐量(points / s) | 吞吐量百分比 | 平均时延(ms) | P95时延(ms) | |
---|---|---|---|---|
IoTDB 0.13 | 17794721.14 | 100 % | 94.28 | 199.92 |
不开启ID表 | 17619721.14 | 99.01 % | 95.21 | 201.20 |
使用Plain ID方法的IoTDB (设备名ID化为原设备名) | 17482948.15 | 98.25 % | 112.24 | 209.28 |
使用SHA256 ID方法的IoTDB (设备名ID化为SHA256值) | 17283384.91 | 97.13 % | 119.67 | 221.57 |
查询性能
时间序列路径模板:root.test.g_1.l1.l2.l3.l4.l5.d_1.s_1
吞吐量(points / s) | 吞吐量百分比 | 平均时延(ms) | P95时延(ms) | |
---|---|---|---|---|
IoTDB 0.13 | 3192.84 | 100 % | 2.01 | 10.28 |
不开启ID表 | 3194.81 | 100.06 % | 2.02 | 9.98 |
使用Plain ID方法的IoTDB (设备名ID化为原设备名) | 3186.35 | 99.81 % | 1.99 | 10.04 |
使用SHA256 ID方法的IoTDB (设备名ID化为SHA256值) | 3169.39 | 99.28 % | 2.14 | 11.37 |
时间序列路径模板:root.test.g_1.d_1.s_1
吞吐量(points / s) | 吞吐量百分比 | 平均时延(ms) | P95时延(ms) | |
---|---|---|---|---|
IoTDB 0.13 | 3247.19 | 100 % | 1.97 | 11.25 |
不开启ID表 | 3201.85 | 98.60 % | 2.04 | 10.97 |
使用Plain ID方法的IoTDB (设备名ID化为原设备名) | 3285.01 | 101.17 % | 2.01 | 10.39 |
使用SHA256 ID方法的IoTDB (设备名ID化为SHA256值) | 3239.10 | 99.75 % | 2.42 | 9.97 |
内存占用测试
时间序列路径模板:root.test.ab01234567_1.ab0123456789.ab0123456789.ab0123456789.ab0123456789.ab0123456789.ab0123456789.ab0123456789.ab0123456789.d_1.s_1 (共270字节)
该路径来源于某公司真实场景及调研时理论计算假设:时序数据库数据文件存储结构调研
内存占用 | 理论占用 | |
---|---|---|
使用Plain ID方法的IoTDB (设备名ID化为原设备名) | 160MB | 159MB |
使用SHA256 ID方法的IoTDB (设备名ID化为SHA256值) | 156MB | 156MB |
实验结论
- 对于写入:时间序列路径层级越多,ID表带来的性能收益越高,在层级比较少的情况下(4层及以下),会带来性能损失。因为ID表查询一次需要进行三次哈希,MMananger需要进行路径层级次哈希,开启ID表后,需要做设备路径到设备ID的转换,具有一定额外开销
- 对于查询:无论是否开启ID表,查询性能基本不变。虽然查询时每一条时间序列需要进行ID化来找到对应文件,但由于查询主要是磁盘操作,ID化带来的开销基本可以忽略不计。