TairRoaring性能白皮书

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性能测试-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