本文介紹雲原生記憶體資料庫Tair記憶體型(相容Redis 6.0)效能測試的測試環境、測試載入器、測試方法與測試結果。
產品概述
Tair記憶體型適合并發量大、讀寫熱點多、對效能要求極高的情境。相比KVStore for Redis社區版,記憶體型主要在下述方面進行了最佳化:
- 採用多執行緒模式,效能約為同規格社區版執行個體的3倍。
- 提供多種增強型資料結構模組(modules),包括exString(包含Redis String命令增強)、exHash、exZset、GIS、Bloom、Doc、TS、Cpc、Roaring、Search和Vector,業務無需再關心儲存的結構和時效性,極大提升業務開發效率。
更多介紹,請參見記憶體型。
測試環境
資料庫
測試環境資訊 | 說明 |
地區和可用性區域 | 華北3(張家口)地區,可用性區域A。 |
儲存介質 | 記憶體型。 |
執行個體版本 | 6.2.1.1 |
執行個體架構 | 標準版(雙副本)架構,不啟用叢集,詳情請參見標準架構。 |
執行個體規格 | 由於測試結果受規格影響較小,本次測試以4 GB(tair.rdb.4g)規格為例,規格詳情請參見記憶體型執行個體規格。 |
測試用戶端
測試環境資訊 | 說明 |
部署壓測工具的裝置 | Elastic Compute Service執行個體,規格為ecs.g5ne.16xlarge,詳情請參見執行個體規格類型系列。 |
地區和可用性區域 | 華北3(張家口)地區,可用性區域A。 |
作業系統 | CentOS 7.2 64位。 |
網路 | 與Tair執行個體為相同Virtual Private Cloud,且與Tair執行個體通過專用網路串連。 |
測試載入器
使用開源Redis的redis-benchmark工具進行壓測,它是Redis官方的效能測試工具,可以有效地測試Tair服務的效能。本次測試使用的redis-benchmark工具版本為7.0.6。
說明 為確保redis-benchmark工具支援--threads參數,自測時推薦使用最新的Redis版本進行編譯,更多資訊請參見Redis開源專案。
使用方法
在ECS執行個體下載Redis原始碼,並且編譯產生redis-benchmark檔案,即可開始測試。
例如測試SET命令的執行效能,測試命令樣本如下(啟動16個線程、256個串連、3000000個Key、Value取值範圍為64位元組):
./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 10000000 -c 256 -t set -d 64 --threads 16
參數 | 說明 |
-h | Tair執行個體的內網串連地址。具體操作,請參見查看串連地址。 |
-p | Tair執行個體的服務連接埠,預設為6379。 |
-a | Tair執行個體的密碼。 說明 如果使用通過控制台建立的帳號串連Tair,串連密碼格式需為 <user>:<password> 。例如,帳號名為admin,密碼為Rp829dlwa,則串連Tair時的密碼為admin:Rp829dlwa 。 |
-c | 並發的串連數量。 |
-n | 測試的總請求數量,可設定較大的值以持續壓測。 |
-t | 測試的命令,例如GET、SET等。 |
-d | SET或GET所操作的值的資料大小,單位為位元組(Byte)。 |
-r | 使用的Key的隨機範圍,即使用多少個不同key。 |
--threads | 啟動多線程壓測,並指定線程個數。 |
說明 參數的更多資訊,請參見redis-benchmark。
測試結果
主要對包括SET、GET等在內的十餘種Redis基礎命令進行效能測試並給出測試單位,且囊括了不同線程數、不同寫入資料大小的情境。
測試單位
測試單位 | 說明 |
QPS | 每秒處理的讀寫運算元,單位為次/秒。 |
Latency | 操作的平均延遲分布,單位為毫秒(ms)。 |
99th Percentile Latency | 99%操作延遲,單位為毫秒(ms),指99%操作的最大延遲時間。例如該指標的值為0.5毫秒,表示99%的請求可以在0.5毫秒內被處理。 |
String資料結構
- GET測試命令樣本如下(啟動16個線程、256個串連、3000000個Key、Value取值範圍為16位元組):
測試結果:./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -d 16 -t get
Value長度(位元組) QPS(次/秒) Average Latency(毫秒) 99th Percentile Latency(毫秒) 16 523907.66 0.476 0.719 128 519363.59 0.476 0.871 256 517027.44 0.480 0.839 1024 487709.72 0.509 0.879 4096 385728.06 0.629 1.319 說明- 讀命令不會受到主備同步和資料持久化的影響,CPU使用率較高。
- 本次測試在開啟AOF落盤功能下進行,若關閉AOF落盤功能大約還可以提升10%的QPS效能。
- SET測試命令樣本如下(啟動16個線程、256個串連、3000000個Key、Value取值範圍為16位元組):
測試結果:./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -d 16 -t set
Value長度(位元組) QPS(次/秒) Average Latency(毫秒) 99th Percentile Latency(毫秒) 16 260642.91 0.956 1.871 128 244758.09 1.035 2.015 256 235128.14 1.072 2.119 1024 173761.95 1.462 2.783 4096 66198.86 3.857 66.687 說明 本次測試在Tair執行個體標準架構上進行,其預設最大頻寬為96 MB/s。大約在Value大小為480位元組、QPS為200000時,測試流量會達到Tair執行個體標準架構的頻寬上限,觸發Tair執行個體的流量控制機制。隨著Value的不斷增大,QPS會快速降低。在實際使用中,若您有更高頻寬需求,您可以選擇叢集架構或讀寫分離架構。 - MSET測試命令樣本如下(啟動16個線程、256個串連、3000000個Key、Value取值範圍為16位元組):
測試結果:./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -d 16 -t mset
Value長度(位元組) QPS(次/秒) Average Latency(毫秒) 99th Percentile Latency(毫秒) 16 66533.60 3.637 9.735 128 66533.60 3.756 12.679 256 70439.07 3.610 14.487 1024 38634.90 6.497 97.407 - INCR測試命令樣本如下(啟動16個線程、256個串連、3000000個Key):
測試結果:./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -t incr
Value長度(位元組) QPS(次/秒) Average Latency(毫秒) 99th Percentile Latency(毫秒) 無 244758.09 1.024 2.879
List資料結構
- LPUSH測試命令樣本如下(啟動16個線程、256個串連、3000000個Key、Value取值範圍為16位元組):
測試結果:./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -d 16 -t lpush
Value長度(位元組) QPS(次/秒) Average Latency(毫秒) 99th Percentile Latency(毫秒) 16 133220.84 1.911 3.943 128 137797.98 1.846 3.831 256 130332.78 1.956 4.087 1024 116400.88 2.183 4.439 4096 68101.34 3.732 8.727 - LPOP測試命令樣本如下(啟動16個線程、256個串連、3000000個Key、Value取值範圍為16位元組):
測試結果:./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -d 16 -t lpop
Value長度(位元組) QPS(次/秒) Average Latency(毫秒) 99th Percentile Latency(毫秒) 16 122354.09 2.084 4.343 128 122324.16 2.085 4.359 256 113079.53 2.239 4.719 1024 74447.23 3.419 7.007 4096 74449.07 3.410 7.071 - RPUSH測試命令樣本如下(啟動16個線程、256個串連、3000000個Key、Value取值範圍為16位元組):
測試結果:./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -d 16 -t rpush
Value長度(位元組) QPS(次/秒) Average Latency(毫秒) 99th Percentile Latency(毫秒) 16 119875.34 2.129 4.583 128 116391.85 2.187 4.631 256 105148.78 2.409 5.095 1024 82674.24 3.073 6.023 4096 69683.18 3.656 6.271 - RPOP測試命令樣本如下(啟動16個線程、256個串連、3000000個Key、Value取值範圍為16位元組):
測試結果:./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -d 16 -t rpop
Value長度(位元組) QPS(次/秒) Average Latency(毫秒) 99th Percentile Latency(毫秒) 16 110996.01 2.281 4.919 128 101584.73 2.500 5.287 256 92205.56 2.764 5.783 1024 76324.23 3.339 6.759 4096 79377.68 3.207 6.267
Set資料結構
- SADD測試命令樣本如下(啟動16個線程、256個串連、3000000個Key):
測試結果:./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -t sadd
Value長度(位元組) QPS(次/秒) Average Latency(毫秒) 99th Percentile Latency(毫秒) 無 111020.66 2.286 4.927 - SPOP測試命令樣本如下(啟動16個線程、256個串連、3000000個Key):
測試結果:./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -t spop
Value長度(位元組) QPS(次/秒) Average Latency(毫秒) 99th Percentile Latency(毫秒) 無 67315.89 3.784 7.847
Zset資料結構
- ZADD測試命令樣本如下(啟動16個線程、256個串連、3000000個Key):
測試結果:./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -t zadd
Value長度(位元組) QPS(次/秒) Average Latency(毫秒) 99th Percentile Latency(毫秒) 無 53490.24 4.761 9.799 - ZPOPMIN測試命令樣本如下(啟動16個線程、256個串連、3000000個Key):
測試結果:./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -t zpopmin
Value長度(位元組) QPS(次/秒) Average Latency(毫秒) 99th Percentile Latency(毫秒) 無 114163.94 2.227 4.871
Hash資料結構
HSET
測試命令樣本如下(啟動16個線程、256個串連、3000000個Key、Value取值範圍為16位元組):
./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 30000000 -c 256 --threads 16 -d 16 -t hset
測試結果:Value長度(位元組) | QPS(次/秒) | Average Latency(毫秒) | 99th Percentile Latency(毫秒) |
16 | 108964.12 | 2.327 | 5.103 |
128 | 111012.43 | 2.293 | 5.039 |
256 | 108960.16 | 2.336 | 5.103 |
1024 | 103334.25 | 2.466 | 5.143 |
4096 | 61469.11 | 4.147 | 7.263 |
總結
Tair記憶體型基於自研的多線程架構,大幅提升了程式運行QPS,降低了延時,可滿足更高的效能需求,並且極大地豐富了業務的使用情境。