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
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
單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
叢集版測試方法與測試結果
- 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 |