本文介绍Tair(企业版)持久内存型性能测试的测试环境、测试工具、测试方法与测试结果。
产品概述
Tair持久内存型,基于持久内存技术,为您提供大容量、兼容Redis的内存数据库产品。单实例成本对比Redis开源版最高可降低30%,且数据持久化不依赖传统磁盘,保证每个操作持久化的同时提供近乎Redis开源版的吞吐和延时,极大提升业务数据可靠性。更多信息请参见持久内存型。
测试环境
测试环境信息  | 说明  | 
地域和可用区  | 所有测试均在华北3(张家口)地域的可用区A中完成。  | 
实例架构  | 标准版(双副本)架构,详情请参见标准架构。  | 
部署压测工具的机器  | |
持久内存型实例规格  | 本次测试以tair.scm.standard.32m.128d规格为例。  | 
测试工具
采用开源社区的YCSB压测工具进行压测。YCSB是一款Java编写的支持多种数据库的性能测试工具,具体安装和使用方法请参见YCSB。
由于开源版本仅支持测试Hash结构的数据,下载YCSB工具后,需要将YCSB/redis/src/main/java/site/ycsb/db/RedisClient.java文件替换为RedisClient.java文件,用于测试String结构的数据。
工作负载
测试的总数据量8 GB,数据分布方法为zipfian,具体测试场景如下:
Load:100%的写操作。
Workload C:100%的读操作。
Workload A:50%的更新操作与50%的读操作。
关于Workload的详细介绍,请参见Core Workloads。
由于应用场景不同,Set、Zset中的复杂命令无法进行通用测试,您可以根据您的业务场景自行测试。
测试命令
#加载数据
workload=a
./bin/ycsb load redis -s -P workloads/workload${workload} -p "redis.host=${server_ip}" -p  "redis.port=${port}" -p "redis.password=${password}" -p "recordcount=${recordcount}" -p "operationcount=${operationcount}" -p "redis.timeout=30000" -p "redis.command_group=${command_group}" -p "fieldcount=${fieldcount}" -p "fieldlength=${fieldlength}" -threads ${threads}  -p "redis.password=***:*****"
#运行Workload C
workload=c
./bin/ycsb run redis -s -P workloads/workload${workload} -p "redis.host=${server_ip}" -p  "redis.port=${port}" -p "redis.password=${password}" -p "recordcount=${recordcount}" -p "operationcount=${operationcount}" -p "redis.timeout=30000" -p "redis.command_group=${command_group}" -p "fieldcount=${fieldcount}" -p "fieldlength=${fieldlength}" -threads ${threads} -p "redis.password=***:*****"
#运行Workload A
workload=a
./bin/ycsb run redis -s -P workloads/workload${workload} -p "redis.host=${server_ip}" -p  "redis.port=${port}" -p "redis.password=${password}" -p "recordcount=${recordcount}" -p "operationcount=${operationcount}" -p "redis.timeout=30000" -p "redis.command_group=${command_group}" -p "fieldcount=${fieldcount}" -p "fieldlength=${fieldlength}" -threads ${threads} -p "redis.password=***:*****" 表 1. 参数说明
参数  | 说明  | 
server_ip  | 实例的IP地址。  | 
port  | 实例的服务端口。  | 
password  | 根据选取账号的不同,密码的填写格式有一定区别: 
 说明  如果忘记密码,请参见修改或重置密码。  | 
recordcount  | 数据装载阶段准备的数据量。  | 
operationcount  | 执行操作的数据量。  | 
command_group  | 测试的数据结构,本案例中,依次测试下述数据结构: 
  | 
fieldcount  | 字段或元素个数,本案例中,String数据结构配置为1,其他数据结构配置为10。  | 
fieldlength  | 值长度,根据测试需求配置。  | 
threads  | YCSB线程数,根据实例规格配置。  | 
测试结果
测试指标  | 说明  | 
QPS  | 每秒处理的读写操作数,单位为次/秒。  | 
INSERT Average Latency  | 写操作平均延迟,单位为微秒(us)。  | 
INSERT 99th Percentile Latency  | 处理速度最快的99%写操作中,最长的延迟时间,单位为微秒。例如该指标的值为500微秒,表示99%的请求可以在500微秒内被处理。  | 
READ AverageLatency  | 读操作平均延迟,单位为微秒。  | 
READ 99thPercentileLatency  | 处理速度最快的99%读操作中,最长的延迟时间,单位为微秒。  | 
UPDATE AverageLatency  | 更新操作平均延迟,单位为微秒。  | 
UPDATE 99thPercentileLatency  | 处理速度最快的99%更新操作中,最长延迟时间,单位为微秒。  | 
Load场景测试结果
表 2. String数据结构
Value长度(字节)  | QPS(次/秒)  | INSERT Average Latency(微秒)  | INSERT 99th Percentile Latency(微秒)  | 
128字节  | 134,478  | 473  | 687  | 
256字节  | 126,139  | 504  | 828  | 
1024字节  | 99,775  | 638  | 1,051  | 
2048字节  | 77,130  | 826  | 1,157  | 
4096字节  | 60,646  | 1,050  | 1,534  | 
表 3. Hash数据结构
Key中的Field数量  | Value长度(字节)  | QPS(次/秒)  | INSERT Average Latency(微秒)  | INSERT 99th Percentile Latency(微秒)  | 
10  | 128  | 47,353  | 1,348  | 1,885  | 
256  | 46,716  | 1,366  | 2,181  | |
1,024  | 27,759  | 2,297  | 2,873  | |
2,048  | 16,605  | 3,833  | 4,923  | 
表 4. List数据结构
Key中的Element数量  | Value长度(字节)  | QPS(次/秒)  | INSERT Average Latency(微秒)  | INSERT 99th Percentile Latency(微秒)  | 
10  | 128  | 64,950  | 979  | 1,310  | 
256  | 47,157  | 1,348  | 1,752  | |
1,024  | 26,719  | 2,386  | 3,457  | |
2,048  | 16,714  | 3,811  | 4,751  | |
4,096  | 10,129  | 6,279  | 7,891  | 
表 5. Set数据结构
Key中的Member数量  | Value长度(字节)  | QPS(次/秒)  | INSERT Average Latency(微秒)  | INSERT 99th Percentile Latency(微秒)  | 
10  | 128  | 63,670  | 1,001  | 1,514  | 
256  | 44,707  | 1,427  | 2,129  | |
1,024  | 25,375  | 2,513  | 3,239  | |
2,048  | 14,318  | 4,451  | 5,619  | |
4,096  | 8,378  | 7,608  | 9,095  | 
表 6. Sorted Set数据结构
Key中的Element数量  | Value长度(字节)  | QPS(次/秒)  | INSERT Average Latency(微秒)  | INSERT 99th Percentile Latency(微秒)  | 
10  | 128  | 40,292  | 1,585  | 2,469  | 
256  | 34,168  | 1,869  | 2,569  | |
1,024  | 21,347  | 2,989  | 3,905  | |
2,048  | 12,868  | 4,956  | 6,255  | |
4,096  | 7,864  | 8,101  | 9,599  | 
Workload C场景测试结果
表 7. String数据结构
Value长度(字节)  | QPS(次/秒)  | READ AverageLatency(微秒)  | READ 99thPercentileLatency(微秒)  | 
128字节  | 170,699  | 362  | 546  | 
256字节  | 163,829  | 380  | 565  | 
1024字节  | 161,491  | 386  | 569  | 
2048字节  | 130,189  | 487  | 729  | 
4096字节  | 115,433  | 548  | 808  | 
表 8. Hash数据结构
Key中的Field数量  | Value长度(字节)  | QPS(次/秒)  | READ AverageLatency(微秒)  | READ 99thPercentileLatency(微秒)  | 
10  | 128  | 96,111  | 662  | 874  | 
256  | 86,892  | 733  | 915  | |
1,024  | 61,608  | 1,030  | 1,293  | |
2,048  | 37,334  | 1,696  | 2,331  | |
4,096  | 25,943  | 2,429  | 3,319  | 
表 9. List数据结构
Key中的Element数量  | Value长度(字节)  | QPS(次/秒)  | READ AverageLatency(微秒)  | READ 99thPercentileLatency(微秒)  | 
10  | 128  | 105,296  | 604  | 889  | 
256  | 97,047  | 655  | 890  | |
1,024  | 66,384  | 955  | 1,192  | |
2,048  | 35,796  | 1,769  | 2,461  | |
4,096  | 26,314  | 2,392  | 3,271  | 
表 10. Set数据结构
Key中的Member数量  | Value长度(字节)  | QPS(次/秒)  | READ AverageLatency(微秒)  | READ 99thPercentileLatency(微秒)  | 
10  | 128  | 97,825  | 651  | 896  | 
256  | 80,954  | 787  | 970  | |
1024  | 59,924  | 1060  | 1313  | |
2048  | 33,356  | 1900  | 2637  | |
4096  | 23,605  | 2677  | 3723  | 
表 11. Sorted Set数据结构
Key中的Element数量  | Value长度(字节)  | QPS(次/秒)  | READ AverageLatency(微秒)  | READ 99thPercentileLatency(微秒)  | 
10  | 128  | 58,380  | 1,093  | 1,341  | 
256  | 56,287  | 1,133  | 1,390  | |
1,024  | 47,468  | 1,338  | 1,688  | |
2,048  | 30,073  | 2,096  | 2,783  | |
4,096  | 21,850  | 2,880  | 3,765  | 
Workload A场景测试结果
表 12. String数据结构
Value长度(字节)  | QPS(次/秒)  | READ AverageLatency(微秒)  | READ 99thPercentileLatency(微秒)  | UPDATE AverageLatency(微秒)  | UPDATE 99thPercentileLatency(微秒)  | 
128  | 141,120  | 451  | 616  | 450  | 618  | 
256  | 137,551  | 463  | 617  | 461  | 618  | 
1,024  | 124,165  | 516  | 724  | 508  | 725  | 
2,048  | 92,652  | 695  | 881  | 678  | 871  | 
4,096  | 78,994  | 819  | 1,042  | 791  | 1,024  | 
表 13. Hash数据结构
Key中的Field数量  | Value长度(字节)  | QPS(次/秒)  | READ AverageLatency(微秒)  | READ 99thPercentileLatency(微秒)  | UPDATE AverageLatency(微秒)  | UPDATE 99thPercentileLatency(微秒)  | 
10  | 128  | 99,495  | 646  | 831  | 633  | 820  | 
256  | 88,235  | 731  | 985  | 712  | 966  | |
1,024  | 72,013  | 892  | 1,159  | 863  | 2,049  | |
2,048  | 45,790  | 1,379  | 1,898  | 1,354  | 2,821  | |
4,096  | 32,912  | 1,891  | 2,931  | 1,915  | 7,887  | 
表 14. List数据结构
Key中的Element数量  | Value长度(字节)  | QPS(次/秒)  | READ AverageLatency(微秒)  | READ 99thPercentileLatency(微秒)  | UPDATE AverageLatency(微秒)  | UPDATE 99thPercentileLatency(微秒)  | 
10  | 128  | 71,696  | 591  | 775  | 1,185  | 1,383  | 
256  | 66,294  | 638  | 800  | 1,281  | 1,456  | |
1,024  | 53,402  | 791  | 1,006  | 1,581  | 1,865  | |
2,048  | 36,519  | 1,221  | 1,581  | 2,232  | 2,831  | |
4,096  | 28,390  | 1,618  | 2,113  | 2,803  | 3,777  | 
表 15. Set数据结构
Key中的Member数量  | Value长度(字节)  | QPS(次/秒)  | READ AverageLatency(微秒)  | READ 99thPercentileLatency(微秒)  | UPDATE AverageLatency(微秒)  | UPDATE 99thPercentileLatency(微秒)  | 
10  | 128  | 66,346  | 640  | 792  | 1,282  | 1,445  | 
256  | 60,010  | 707  | 993  | 1,415  | 1,957  | |
1,024  | 45,359  | 933  | 1,128  | 1,858  | 2,073  | |
2,048  | 29,027  | 1,529  | 2,021  | 2,820  | 4,507  | |
4,096  | 21,440  | 2,144  | 2,773  | 3,726  | 5,095  | 
表 16. Sorted Set数据结构
Key中的Element数量  | Value长度(字节)  | QPS(次/秒)  | READ AverageLatency(微秒)  | READ 99thPercentileLatency(微秒)  | UPDATE AverageLatency(微秒)  | UPDATE 99thPercentileLatency(微秒)  | 
10  | 128  | 49,695  | 861  | 1,050  | 1,707  | 1,912  | 
256  | 48,036  | 891  | 1,084  | 1,763  | 1,970  | |
1,024  | 39,795  | 1,081  | 1,386  | 2,107  | 2,563  | |
2,048  | 28,415  | 1,597  | 1,981  | 2,855  | 3,589  | |
4,096  | 21,317  | 2,247  | 2,821  | 3,665  | 4,787  |