TairRoaring是基于Tair引擎的RoaringBitmap实现,提供高效的计算模块和极高的稳定性,支持使用少量的存储空间来实现海量数据的查询优化。
TairRoaring在RoaringBitmap的基础上完成大量优化:
通过2层索引和多种动态容器(Container),平衡了多种场景下性能和空间效率。
使用了包括SIMD instructions、Vectorization、PopCnt算法等多种工程优化,提升了计算效率,实现了高效的时空效率。
基于Tair提供的强大计算性能和极高的稳定性,为用户场景保驾护航。
关于TairRoaring的详情介绍,请参见Roaring。
测试工具
本文提供基于Go语言编写、类似redis-benchmark语法的测试工具,方便使用与修改,支持生成2个RAND随机值,便于构建更灵活的测试用例,同时支持将结果以直方图的形式输出,更多信息请参见TairRoaring测试工具。
用法:
Usage of ./redis:
-a string 实例账号密码,格式为<user>:<password>。
-batching int 管道(Pipeline)模式,并设置单次Pipeline执行的独立命令个数,该模式为MULTI-EXEC的组合命令,例如-batching 10表示一条MULTI和EXEC之间包含10条Command命令。
-c int 运行的总测试数,该参数会屏蔽测试持续时间参数(-d)。
-command string 测试命令。您可以将__RAND__、__RAND2__作为随机字段添加到命令或参数的后缀中,随机字段仅在后缀时生效并替换为随机值,默认命令为TR.GETBIT foo-__RAND__。
-d int 测试持续时间,单位秒,默认30。
-h string 实例的连接地址,默认为127.0.0.1。
-p int 并发数,默认为4。
-port int 实例的端口,默认为6379。
-r int 设置__RAND__随机值的范围,默认为100000000。
-r2 int 设置__RAND2__随机值的范围,默认为100000000。
示例:
# 通过TR.SETBIT命令进行测试(Key为10万以内的随机数,Field为1000万以内的随机数)。
./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com -a user:password -d 30 -r 100000 -r2 10000000 -command "TR.SETBIT foo-__RAND__ bar-__RAND2__" -p 20 -c 1
标准版测试方法与测试结果
测试实例规格为Tair(企业版)内存型16 GB,标准版,网络时延低于0.1ms。
单Key测试
性能测试
对同一个Key并发写入,通过调整并发取得最大QPS值。
读命令测试
测试的TairRoaring命令:TR.GETBIT、TR.GETBITS、TR.RANGE、TR.SCAN、TR.RANK,测试命令示例:
./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com -a user:password -d 30 -r 100000 -r2 10000000 -command "TR.GETBIT foo-__RAND__ bar-__RAND2__" -p 20 -c 1
测试结果:
压测命令
Key数量
读取数量
参数范围
QPS参考值
平均时延(ms)
TR.GETBIT
1
1
1~10000000
255000
0.21
TR.GETBITS
1
100
1~10000000
54000
0.97
TR.RANK
1
1
1~10000000
161000
0.24
TR.RANGE
1
100
0~100
129000
0.46
TR.SCAN
1
100
1~10000000
130000
0.38
写命令测试
测试的TairRoaring命令:TR.SETBIT、TR.SETBITS、TR.APPENDBITARRAY、TR.SETRANGE、TR.FLIPRANGE,测试命令示例:
./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com -a user:password -d 30 -r 100000 -r2 10000000 -command "TR.SETBIT foo-__RAND__ bar-__RAND2__" -p 20 -c 1
测试结果:
压测命令
Key数量
读取数量
参数范围
QPS参考值
平均时延(ms)
TR.SETBIT
1
1
1~10000000
145000
0.37
TR.SETBITS
1
100
1~10000000
22000
0.71
TR.SETBITS(有序)
1
100(bit的最大偏移量为2的32次方)
1~6000
28000
0.66
TR.APPENDBITARRAY
1
1000(其中500个bit为1)
1~10000000
10000
0.38
TR.SETRANGE
1
-
1000
130000
0.3
TR.FLIPRANGE
1
-
1~10000000
100000
0.46
batch测试
测试不同命令在Pipeline模式下不同batching大小的性能情况。
TR.SETBIT
测试命令示例:
./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com -a user:password -d 30 -r 10000000 -command "TR.SETBIT foo-__RAND__ 1" -batching 10 -p 20 -c 1
parallel
batching
bps(bit per second)
平均时延(ms)
20
10
460000
0.42
10
50
665000
0.72
6
100
660000
0.85
3
200
680000
0.79
3
500
681500
1.96
2
100
658000
2.6
TR.GETBIT
测试命令示例:
./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com -a user:password -d 30 -r 100000 -r2 10000000 -command "TR.GETBIT foo-__RAND__ __RAND2__" -batching 10 -p 20 -c 1
说明若foo-__RAND__指定的Key不存在,则会按照bit为0返回,因此需要预先写入数据才能较好地测试不同负载下的表现。
parallel
batching
bps(bit per second)
平均时延(ms)
20
10
572700
0.34
10
50
725900
0.65
7
100
772000
0.85
7
200
788800
1.67
5
500
746000
3.1
2
100
770000
2.1
单Key内存测试
通过TR.STAT命令分析不同容量场景下RoaringBitmap的bit分布情况,测试命令示例:
TR.STAT foo JSON
稀疏场景
稀疏场景指bit分布较为分散,bit分布密度低于6.25%。该场景下RoaringBitmap基本以array容器为主,容量约为cardinality * 2 Byte。
cardinality
rle-c
array-c
bitset-c
heap mem (byte)
37700484
-
65536
-
75400968
75011384
-
65536
-
150022768
100403264
-
65536
-
200806528
163090592
-
65536
-
326181184
常规随机分布场景
该场景下RoaringBitmap基本以bitset容器为主,当array容器内元素超过4096时,会陆续转换成bitset容量,符合推算逻辑。
cardinality
rle-c
array-c
bitset-c
heap mem (byte)
253104088
-
65534
2
506208102
261169659
-
63273
2263
522227634
267974804
-
35932
29604
533159296
273694253
-
6607
58929
536491922
343504134
-
0
65536
536870912
535589835
-
0
65536
536870912
连续随机bit场景
连续随机bit场景的存储容量与bit分布逻辑强相关,该场景下测试结果参考意义不大。
多Key模型测试
多Key写入测试
测试多个Key并发写入时引擎的总体性能,测试命令示例(TR.SETBITS每次创建100个随机bit):
./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com -a user:password -d 30 -r 10000000 -r2 100000 -command "TR.SETBITS foo-__RAND2__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__" -p 20
压测命令
FIELDS/RANGE
QPS参考值
平均时延(ms)
TR.SETBIT
1
91003
0.43
TR.SETBITS
100
15127
0.96
TR.GETBIT
1
154941
0.32
TR.GETBITS
100
40166
1.08
TR.SCAN
100
104637
0.47
TR.RANK
-
151161
0.32
集合运算
TR.BITOP
对多个RoaringBitmap执行集合运算逻辑操作,并将运算结果存储至新的Key中,支持AND、OR、NOT、DIFF、XOR运算逻辑。
测试命令示例:
./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com -a user:password -d 30 -r 100000 -r2 10000000 -command "TR.BITOP dest-__RAND__ AND foo-__RAND__ foo-__RAND__" -p 3 -c 1
sub命令
parallel
QPS参考值
平均时延(ms)
AND
3
940
3.18
OR
2
595
3.45
XOR
2
551
3.61
DIFF
3
3577
0.83
NOT
1
1281
0.77
TR.BITOPCARD
对多个RoaringBitmap执行集合运算逻辑操作,仅返回运算结果中bit值为1的数量,支持AND、OR、NOT、DIFF、XOR运算逻辑。
测试命令示例:
./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com -a user:password -d 30 -r 100000 -r2 10000000 -command "TR.BITOPCARD AND foo-__RAND__ foo-__RAND__" -p 2 -c 1
sub命令
parallel
QPS参考值
平均时延(ms)
AND
2
971
2.05
OR
2
609
3.27
XOR
2
572
3.48
DIFF
2
4290
0.46
NOT
2
3577
0.55
集群版测试方法与测试结果
- 8 GB集群版(2分片)
- 16 GB集群版(4分片)
- 32 GB集群版(8分片)
- 64 GB集群版(16分片)
测试的TairRoaring命令:TR.GITBIT、TR.GITBITS、TR.SETBIT、TR.SETBITS,测试命令示例:
./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com -a user:password -d 30 -r 100000 -r2 10000000 -command "TR.SETBIT foo-__RAND__ bar-__RAND2__" -p 20 -c 1
测试结果:
压测命令 | 2分片集群(QPS值) | 4分片集群(QPS值) | 8分片集群(QPS值) | 16分片集群(QPS值) |
TR.GITBIT | 590742 | 567738 | 569610 | 555178 |
TR.GITBITS | 53900 | 91991 | 172969 | 229214 |
TR.SETBIT | 316753 | 530367 | 577406 | 558301 |
TR.SETBITS | 31917 | 57843 | 116614 | 160891 |