TairRoaring是基于Tair引擎的RoaringBitmap实现,提供高效的计算模块和极高的稳定性,支持使用少量的存储空间来实现海量数据的查询优化。
TairRoaring在RoaringBitmap的基础上完成大量优化:
- 通过2层索引和多种动态容器(Container),平衡了多种场景下性能和空间效率。
- 使用了包括SIMD instructions、Vectorization、PopCnt算法等多种工程优化,提升了计算效率,实现了高效的时空效率。
- 基于Tair提供的强大计算性能和极高的稳定性,为用户场景保驾护航。
说明 关于TairRoaring的详情介绍,请参见TairRoaring。
测试工具
本文提供基于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
- TR.SETBIT
- 读命令测试
- 单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
- TR.BITOP
集群版测试方法与测试结果
测试4个不同分片数的内存型集群版实例,每个分片均为4 GB,规格如下:
- 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 |
