全部产品
Search
文档中心

云数据库 Tair(兼容 Redis®):TairRoaring性能白皮书

更新时间:Sep 10, 2024

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.GETBIT111~100000002550000.21
      TR.GETBITS11001~10000000540000.97
      TR.RANK111~100000001610000.24
      TR.RANGE11000~1001290000.46
      TR.SCAN11001~100000001300000.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.SETBIT111~100000001450000.37
      TR.SETBITS11001~10000000220000.71
      TR.SETBITS(有序)1100(bit的最大偏移量为2的32次方)1~6000280000.66
      TR.APPENDBITARRAY11000(其中500个bit为1)1~10000000100000.38
      TR.SETRANGE1-10001300000.3
      TR.FLIPRANGE1-1~100000001000000.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
        parallelbatchingbps(bit per second)平均时延(ms)
        20104600000.42
        10506650000.72
        61006600000.85
        32006800000.79
        35006815001.96
        21006580002.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返回,因此需要预先写入数据才能较好地测试不同负载下的表现。
        parallelbatchingbps(bit per second)平均时延(ms)
        20105727000.34
        10507259000.65
        71007720000.85
        72007888001.67
        55007460003.1
        21007700002.1
        TairRoaring性能发布-4
  • 单Key内存测试
    通过TR.STAT命令分析不同容量场景下RoaringBitmap的bit分布情况,测试命令示例:
     TR.STAT foo JSON
    • 稀疏场景

      稀疏场景指bit分布较为分散,bit分布密度低于6.25%。该场景下RoaringBitmap基本以array容器为主,容量约为cardinality * 2 Byte。

      cardinalityrle-carray-cbitset-cheap mem (byte)
      37700484-65536-75400968
      75011384-65536-150022768
      100403264-65536-200806528
      163090592-65536-326181184
    • 常规随机分布场景

      该场景下RoaringBitmap基本以bitset容器为主,当array容器内元素超过4096时,会陆续转换成bitset容量,符合推算逻辑。

      cardinalityrle-carray-cbitset-cheap mem (byte)
      253104088-655342506208102
      261169659-632732263522227634
      267974804-3593229604533159296
      273694253-660758929536491922
      343504134-065536536870912
      535589835-065536536870912
    • 连续随机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/RANGEQPS参考值平均时延(ms)
    TR.SETBIT1910030.43
    TR.SETBITS100151270.96
    TR.GETBIT11549410.32
    TR.GETBITS100401661.08
    TR.SCAN1001046370.47
    TR.RANK-1511610.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命令parallelQPS参考值平均时延(ms)
      AND39403.18
      OR25953.45
      XOR25513.61
      DIFF335770.83
      NOT112810.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命令parallelQPS参考值平均时延(ms)
      AND29712.05
      OR26093.27
      XOR25723.48
      DIFF242900.46
      NOT235770.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.GITBIT590742567738569610555178
TR.GITBITS5390091991172969229214
TR.SETBIT316753530367577406558301
TR.SETBITS3191757843116614160891
TairRoaring性能测试-9