全部產品
Search
文件中心

Tair (Redis® OSS-Compatible):TairRoaring效能白皮書

更新時間:Oct 30, 2024

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

        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