本文介绍云原生内存数据库Tair持久内存型性能测试的测试环境、测试工具、测试方法与测试结果。
产品概述
Tair持久内存型,基于持久内存技术,为您提供大容量、兼容Redis的内存数据库产品。单实例成本对比云数据库Redis社区版最高可降低30%,且数据持久化不依赖传统磁盘,保证每个操作持久化的同时提供近乎Redis社区版的吞吐和延时,极大提升业务数据可靠性。更多信息请参见持久内存型。
测试环境
测试环境信息 |
说明 |
地域和可用区 |
所有测试均在华北3(张家口)地域的可用区A中完成。 |
Redis实例架构 |
标准版(双副本)架构,详情请参见标准架构。 |
部署压测工具的机器 |
云服务器ECS实例,规格为ecs.g6e.8xlarge,详情请参见实例规格族。 |
持久内存型实例规格 |
本次测试以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 |
Tair实例的IP地址。 |
port |
Tair实例的服务端口。 |
password |
根据选取账号的不同,密码的填写格式有一定区别:
- 使用默认账号(以实例ID命名的账号):直接填写密码即可。例如实例默认账号为
r-bp1zxszhcgatnx**** ,自定义密码为Password21 ,密码验证命令为AUTH Password21 。
- 使用新创建的账号:密码格式为
user:password 。例如自定义账号为testaccount ,密码为Rp829dlwa ,密码验证命令为AUTH testaccount:Rp829dlwa 。
|
recordcount |
数据装载阶段准备的数据量。 |
operationcount |
执行操作的数据量。 |
command_group |
测试的数据结构,本案例中,依次测试下述数据结构:
- String
- Hash
- List
- Set
- Zset
|
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 |