本文介绍云原生内存数据库Tair内存型(兼容Redis 6.0)性能测试的测试环境、测试工具、测试方法与测试结果。

产品概述

Tair内存型适合并发量大、读写热点多、对性能要求极高的场景。相比云数据库Redis社区版,内存型主要在下述方面进行了优化:

更多介绍,请参见内存型

测试环境

数据库

测试环境信息说明
地域和可用区华北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
表 1. 参数说明
参数说明
-hTair实例的内网连接地址。具体操作,请参见查看连接地址
-pTair实例的服务端口,默认为6379。
-aTair实例的密码。
说明 如果使用通过控制台创建的账号连接Tair,连接密码格式需为<user>:<password>。例如,账号名为admin,密码为Rp829dlwa,则连接Tair时的密码为admin:Rp829dlwa
-c并发的连接数量。
-n测试的总请求数量,可设置较大的值以持续压测。
-t测试的命令,例如GET、SET等。
-dSET或GET所操作的值的数据大小,单位为字节(Byte)。
-r使用的Key的随机范围,即使用多少个不同key。
--threads启动多线程压测,并指定线程个数。
说明 参数的更多信息,请参见redis-benchmark

测试结果

主要对包括SET、GET等在内的十余种Redis基础命令进行性能测试并给出测试指标,且囊括了不同线程数、不同写入数据大小的场景。

测试指标

测试指标说明
QPS每秒处理的读写操作数,单位为次/秒。
Latency操作的平均延迟分布,单位为毫秒(ms)。
99th Percentile Latency99%操作延迟,单位为毫秒(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(毫秒)
    16523907.660.4760.719
    128519363.590.4760.871
    256517027.440.4800.839
    1024487709.720.5090.879
    4096385728.060.6291.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(毫秒)
    16260642.910.9561.871
    128244758.091.0352.015
    256235128.141.0722.119
    1024173761.951.4622.783
    409666198.863.85766.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(毫秒)
    1666533.603.6379.735
    12866533.603.75612.679
    25670439.073.61014.487
    102438634.906.49797.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.091.0242.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(毫秒)
    16133220.841.9113.943
    128137797.981.8463.831
    256130332.781.9564.087
    1024116400.882.1834.439
    409668101.343.7328.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(毫秒)
    16122354.092.0844.343
    128122324.162.0854.359
    256113079.532.2394.719
    102474447.233.4197.007
    409674449.073.4107.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(毫秒)
    16119875.342.1294.583
    128116391.852.1874.631
    256105148.782.4095.095
    102482674.243.0736.023
    409669683.183.6566.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(毫秒)
    16110996.012.2814.919
    128101584.732.5005.287
    25692205.562.7645.783
    102476324.233.3396.759
    409679377.683.2076.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.662.2864.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.893.7847.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.244.7619.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.942.2274.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(毫秒)
16108964.122.3275.103
128111012.432.2935.039
256108960.162.3365.103
1024103334.252.4665.143
409661469.114.1477.263

总结

Tair内存型基于自研的多线程架构,大幅提升了程序运行QPS,降低了延时,可满足更高的性能需求,并且极大地丰富了业务的使用场景。