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性能测试-1
    • 写命令测试
      测试的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
      TairRoaring性能测试-2
    • 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
        TairRoaring性能测试-3
      • 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
        TairRoaring性能发布-4
  • 单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
    TairRoaring性能测试-5
  • 集合运算
    • 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
      TairRoaring性能测试-7
    • 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
      TairRoaring性能测试-8

集群版测试方法与测试结果

测试4个不同分片数的内存型集群版实例,每个分片均为4 GB,规格如下:
  • 8 GB集群版(2分片)
  • 16 GB集群版(4分片)
  • 32 GB集群版(8分片)
  • 64 GB集群版(16分片)
为避免测试场景存在网络带宽干扰,将所有集群的带宽均升级至最大(2048 MB/s)。压力测试客户端部署在Tair集群实例相同的可用区,并通过Proxy(代理模式)访问Tair集群实例。根据不同的测试命令分别测试各集群实例执行单Key命令的平均QPS值。
测试的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
TairRoaring性能测试-9