本文介绍云原生内存数据库Tair内存型(兼容Redis 6.0)性能测试的测试环境、测试工具、测试方法与测试结果。
产品概述
Tair内存型适合并发量大、读写热点多、对性能要求极高的场景。相比云数据库Redis社区版,内存型主要在下述方面进行了优化:
- 采用多线程模型,性能约为同规格社区版实例的3倍。
- 提供多种增强型数据结构模块(modules),包括TairString(包含CAS和CAD命令)、TairHash、TairGIS、TairBloom、TairDoc、TairTS、TairCpc、TairZset、TairRoaring、TairVector和TairSearch,业务无需再关心存储的结构和时效性,极大提升业务开发效率。
更多介绍,请参见内存型。
测试环境
数据库
测试环境信息 | 说明 |
---|---|
地域和可用区 | 华北3(张家口)地域,可用区A。 |
存储介质 | 内存型。 |
实例版本 | 6.2.1.1 |
实例架构 | 标准版(双副本)架构,不启用集群,详情请参见标准架构。 |
实例规格 | 由于测试结果受规格影响较小,本次测试以4 GB(tair.rdb.4g)规格为例,规格详情请参见内存型实例规格。 |
测试客户端
测试环境信息 | 说明 |
---|---|
部署压测工具的设备 | 云服务器ECS实例,规格为ecs.g5ne.16xlarge,详情请参见实例规格族。 |
地域和可用区 | 华北3(张家口)地域,可用区A。 |
操作系统 | CentOS 7.2 64位。 |
网络 | 与Tair实例为相同专有网络(VPC),且与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,降低了延时,可满足更高的性能需求,并且极大地丰富了业务的使用场景。