本文介紹Tair記憶體型、Redis開源版的效能測試結果,以及測試環境、測試載入器與測試方法。
測試結果
對包括SET、GET等在內的十餘種Redis基礎命令進行效能測試並給出測試單位。
命令 | Tair記憶體型 | Redis開源版 | ||||
QPS | Average Latency | 99th Percentile Latency | QPS | Average Latency | 99th Percentile Latency | |
SET | 282,656 | 0.45 | 0.86 | 142,376 | 0.45 | 0.72 |
GET | 519,761 | 0.24 | 0.36 | 204,690 | 0.31 | 0.47 |
ZADD | 208,169 | 0.62 | 1.14 | 113,135 | 0.57 | 0.78 |
ZSCORE | 463,904 | 0.27 | 0.40 | 170,163 | 0.37 | 0.54 |
HSET | 260,069 | 0.49 | 1.03 | 124,613 | 0.51 | 0.97 |
HGET | 494,603 | 0.25 | 0.37 | 188,903 | 0.34 | 0.52 |
LPUSH | 286,324 | 0.44 | 0.84 | 153,269 | 0.42 | 0.59 |
LINDEX | 414,070 | 0.30 | 0.45 | 157,568 | 0.40 | 0.58 |
SADD | 292,738 | 0.44 | 0.86 | 140,155 | 0.45 | 0.63 |
SISMEMBER | 531,139 | 0.24 | 0.34 | 181,492 | 0.35 | 0.52 |
EVALSHA | 214,303 | 0.60 | 1.12 | 101,136 | 0.63 | 0.91 |
測試單位說明:
QPS:每秒處理的讀寫運算元,單位為次/秒。
Average Latency:操作的平均延遲時間,單位為毫秒(ms)。
99th Percentile Latency:99%操作延遲,指99%操作的最大延遲時間,單位為毫秒(ms)。例如該指標的值為0.5毫秒,表示99%的請求可以在0.5毫秒內被處理。
測試結果為在多個可用性區域、對多個執行個體、進行多次測試的平均值。
測試結果中的延遲為全鏈路延遲,包含資料包在DB側及壓測端排隊的時延。
測試結果受到多種不可控因素的影響,存在約10%的誤差屬於合理範圍。
測試結果僅代表新購執行個體進行單一命令測試的結果,而生產環境執行個體的壓力測試請以業務壓測情境為準。
測試結果反映了執行個體的極限效能,在生產環境中,不建議將執行個體維持在極限負載狀態。
測試環境
資料庫
測試環境資訊 | 說明 |
地區和可用性區域 | 華北2(北京)可用性區域L、華東1(杭州)可用性區域K、華東2(上海)可用性區域N、華南1(深圳)可用性區域C。 說明 本測試在多個地區進行,本測試報告僅代表上述可用性區域的平均效能水平。 |
執行個體架構 | 標準架構(雙副本),不啟用叢集,詳情請參見標準架構。 說明 其他架構的效能說明:
n為叢集架構的分區節點數或讀寫分離架構的總節點數。 |
執行個體規格 | 由於測試結果受規格影響較小,本次測試以下執行個體規格:
規格詳情請參見規格查詢導航。 |
測試用戶端
測試環境資訊 | 說明 |
部署壓測工具的裝置 | Elastic Compute Service執行個體,規格為ecs.g7.8xlarge,詳情請參見執行個體規格類型系列。 |
地區和可用性區域 | 與執行個體對應的地區及可用性區域。 |
作業系統 | Alibaba Cloud Linux 3。 |
網路 | 與Tair執行個體為相同Virtual Private Cloud,且與Tair執行個體通過專用網路串連。 |
測試載入器
使用resp-benchmark開源工具進行壓測。SET、GET等常規測試項與redis-benchmark保持一致,在其餘測試項中可以更有效地類比使用者真實情境,壓滿Tair多個線程,從而體現Tair的實際效能。
您可以執行resp-benchmark --help
命令擷取更詳細的配置項說明,或訪問其GitHub首頁。
安裝方法
pip install resp-benchmark==0.1.7
測試樣本
每次測試時建議先清空資料庫,避免已有資料存在幹擾。
resp-benchmark在未指定串連數時會自動選擇相對合適的串連數,為測得極限負載下的資料建議手動調整串連數,比如設定為128,可以通過增加參數
-c 128
實現。串連數過低時,測試壓力不足,導致QPS資料偏低;串連數過高時,測試壓力可能會超過DB的處理能力,資料包會在網路鏈路中排隊較長時間,導致延遲資料偏高。因為影響因素較多,難以在下文中給出固定的串連數配置,常見的串連數設定為32、64、128、192和256,可根據實際測試情況自行調整。
以下為各命令的測試執行個體:
SET
該指標代表SET命令的效能。
測試SET命令,Key範圍為0-10000000(表示產生的Key名稱為
key_0000000000
~key_0009999999
),Value大小為64位元組,測試時間長度20秒:resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "SET {key uniform 10000000} {value 64}"
GET
該指標代表GET命令的效能。
構造資料,Key範圍為0-10000000,Value大小為64位元組:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10000000 "SET {key sequence 10000000} {value 64}"
測試GET命令,測試時間長度20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "GET {key uniform 10000000}"
ZADD
該指標代表ZADD命令的效能。
測試ZADD的寫效能,Key範圍為0-1000,Score範圍為0-70000,每個Key最多10000個Field,測試時間長度20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 "ZADD {key uniform 1000} {rand 70000} {key uniform 10000}"
ZSCORE
該指標代表ZSCORE命令的效能。
構造資料,Key範圍為0-1000,Score範圍為0-70000,每個Key最多10007個Field:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10007000 "ZADD {key sequence 1000} {rand 70000} {key sequence 10007}"
測試ZSCORE命令,測試時間長度20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "ZSCORE {key uniform 1000} {key uniform 10007}"
HSET
該指標代表HSET命令的效能。
測試HSET命令,Key範圍為0-1000,Field範圍為0-10000,Value大小為64位元組,測試時間長度20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "HSET {key uniform 1000} {key uniform 10000} {value 64}"
HGET
該指標代表HGET命令的效能。
構造資料,Key範圍為0-1000,每個Key包含10007個Field,資料大小為64位元組:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10007000 "HSET {key sequence 1000} {key sequence 10007} {value 64}"
測試HGET命令,測試時間長度20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "HGET {key uniform 1000} {key uniform 10007}"
LPUSH
該指標代表LPUSH命令的效能。
測試LPUSH命令,Key範圍為0-1000,Value大小為64位元組,測試時間長度20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "LPUSH {key uniform 1000} {value 64}"
LINDEX
該指標代表LINDEX命令的效能。
構造資料,Key範圍為0-1000,每個Key包含10000條資料,資料大小為64位元組:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10000000 "LPUSH {key sequence 1000} {value 64}"
測試LINDEX命令,測試時間長度20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "LINDEX {key uniform 1000} {rand 10000}"
SADD
該指標代表SADD命令的效能。
測試SADD命令,Key範圍為0-1000,Value大小為64位元組,測試時間長度20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "SADD {key uniform 1000} {value 64}"
SISMEMBER
該指標代表SISMEMBER命令的效能。
構造資料,Key範圍為0-1000,每個Key包含10007條資料,資料大小為64位元組:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10007000 "SADD {key sequence 1000} {key sequence 10007}"
測試SISMEMBER命令,測試時間長度20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "SISMEMBER {key uniform 1000} {key uniform 10007}"
EVALSHA
該指標代表在EVALSHA中執行SET命令的效能,其中SET命令的Key範圍為0-10000000,Value大小為64位元組。
載入Lua指令碼:
redis-cli -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 SCRIPT LOAD "return redis.call('SET', KEYS[1], ARGV[1])"
測試命令時間長度20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "EVALSHA d8f2fad9f8e86a53d2a6ebd960b33c4972cacc37 1 {key uniform 10000000} {value 64}"