本文介绍Tair内存型、Redis开源版的性能测试结果,以及测试环境、测试工具与测试方法。
测试结果
对包括SET、GET等在内的十余种Redis基础命令进行性能测试并给出测试指标。
命令 | Tair内存型 | Redis开源版 | ||||
QPS | Average Latency | 99th Percentile Latency | QPS | Average Latency | 99th Percentile Latency | |
SET | 282,656 | 0.45 | 0.86 | 142,376 | 0.45 | 0.72 |
GET | 519,761 | 0.24 | 0.36 | 204,690 | 0.31 | 0.47 |
ZADD | 208,169 | 0.62 | 1.14 | 113,135 | 0.57 | 0.78 |
ZSCORE | 463,904 | 0.27 | 0.40 | 170,163 | 0.37 | 0.54 |
HSET | 260,069 | 0.49 | 1.03 | 124,613 | 0.51 | 0.97 |
HGET | 494,603 | 0.25 | 0.37 | 188,903 | 0.34 | 0.52 |
LPUSH | 286,324 | 0.44 | 0.84 | 153,269 | 0.42 | 0.59 |
LINDEX | 414,070 | 0.30 | 0.45 | 157,568 | 0.40 | 0.58 |
SADD | 292,738 | 0.44 | 0.86 | 140,155 | 0.45 | 0.63 |
SISMEMBER | 531,139 | 0.24 | 0.34 | 181,492 | 0.35 | 0.52 |
EVALSHA | 214,303 | 0.60 | 1.12 | 101,136 | 0.63 | 0.91 |
测试指标说明:
QPS:每秒处理的读写操作数,单位为次/秒。
Average Latency:操作的平均延迟时间,单位为毫秒(ms)。
99th Percentile Latency:99%操作延迟,指99%操作的最大延迟时间,单位为毫秒(ms)。例如该指标的值为0.5毫秒,表示99%的请求可以在0.5毫秒内被处理。
测试结果为在多个可用区、对多个实例、进行多次测试的平均值。
测试结果中的延迟为全链路延迟,包含数据包在DB侧及压测端排队的时延。
测试结果受到多种不可控因素的影响,存在约10%的误差属于合理范围。
测试结果仅代表新购实例进行单一命令测试的结果,而生产环境实例的压力测试请以业务压测场景为准。
测试结果反映了实例的极限性能,在生产环境中,不建议将实例维持在极限负载状态。
测试环境
数据库
测试环境信息 | 说明 |
地域和可用区 | 华北2(北京)可用区L、华东1(杭州)可用区K、华东2(上海)可用区N、华南1(深圳)可用区C。 说明 本测试在多个地域进行,本测试报告仅代表上述可用区的平均性能水平。 |
实例架构 | 标准架构(双副本),不启用集群,详情请参见标准架构。 说明 其他架构的性能说明:
n为集群架构的分片节点数或读写分离架构的总节点数。 |
实例规格 | 由于测试结果受规格影响较小,本次测试以下实例规格:
规格详情请参见规格查询导航。 |
测试客户端
测试环境信息 | 说明 |
部署压测工具的设备 | |
地域和可用区 | 与实例对应的地域及可用区。 |
操作系统 | Alibaba Cloud Linux 3。 |
网络 | 与Tair实例为相同专有网络(VPC),且与Tair实例通过专有网络连接。 |
测试工具
使用resp-benchmark开源工具进行压测。SET、GET等常规测试项与redis-benchmark保持一致,在其余测试项中可以更有效地模拟用户真实场景,压满Tair多个线程,从而体现Tair的实际性能。
您可以执行resp-benchmark --help
命令获取更详细的配置项说明,或访问其GitHub主页。
安装方法
pip install resp-benchmark==0.1.7
测试示例
每次测试时建议先清空数据库,避免已有数据存在干扰。
resp-benchmark在未指定连接数时会自动选择相对合适的连接数,为测得极限负载下的数据建议手动调整连接数,比如设置为128,可以通过增加参数
-c 128
实现。连接数过低时,测试压力不足,导致QPS数据偏低;连接数过高时,测试压力可能会超过DB的处理能力,数据包会在网络链路中排队较长时间,导致延迟数据偏高。因为影响因素较多,难以在下文中给出固定的连接数配置,常见的连接数设置为32、64、128、192和256,可根据实际测试情况自行调整。
以下为各命令的测试实例:
SET
该指标代表SET命令的性能。
测试SET命令,Key范围为0-10000000(表示生成的Key名称为
key_0000000000
~key_0009999999
),Value大小为64字节,测试时长20秒:resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "SET {key uniform 10000000} {value 64}"
GET
该指标代表GET命令的性能。
构造数据,Key范围为0-10000000,Value大小为64字节:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10000000 "SET {key sequence 10000000} {value 64}"
测试GET命令,测试时长20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "GET {key uniform 10000000}"
ZADD
该指标代表ZADD命令的性能。
测试ZADD的写性能,Key范围为0-1000,Score范围为0-70000,每个Key最多10000个Field,测试时长20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 "ZADD {key uniform 1000} {rand 70000} {key uniform 10000}"
ZSCORE
该指标代表ZSCORE命令的性能。
构造数据,Key范围为0-1000,Score范围为0-70000,每个Key最多10007个Field:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10007000 "ZADD {key sequence 1000} {rand 70000} {key sequence 10007}"
测试ZSCORE命令,测试时长20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "ZSCORE {key uniform 1000} {key uniform 10007}"
HSET
该指标代表HSET命令的性能。
测试HSET命令,Key范围为0-1000,Field范围为0-10000,Value大小为64字节,测试时长20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "HSET {key uniform 1000} {key uniform 10000} {value 64}"
HGET
该指标代表HGET命令的性能。
构造数据,Key范围为0-1000,每个Key包含10007个Field,数据大小为64字节:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10007000 "HSET {key sequence 1000} {key sequence 10007} {value 64}"
测试HGET命令,测试时长20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "HGET {key uniform 1000} {key uniform 10007}"
LPUSH
该指标代表LPUSH命令的性能。
测试LPUSH命令,Key范围为0-1000,Value大小为64字节,测试时长20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "LPUSH {key uniform 1000} {value 64}"
LINDEX
该指标代表LINDEX命令的性能。
构造数据,Key范围为0-1000,每个Key包含10000条数据,数据大小为64字节:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10000000 "LPUSH {key sequence 1000} {value 64}"
测试LINDEX命令,测试时长20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "LINDEX {key uniform 1000} {rand 10000}"
SADD
该指标代表SADD命令的性能。
测试SADD命令,Key范围为0-1000,Value大小为64字节,测试时长20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "SADD {key uniform 1000} {value 64}"
SISMEMBER
该指标代表SISMEMBER命令的性能。
构造数据,Key范围为0-1000,每个Key包含10007条数据,数据大小为64字节:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10007000 "SADD {key sequence 1000} {key sequence 10007}"
测试SISMEMBER命令,测试时长20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "SISMEMBER {key uniform 1000} {key uniform 10007}"
EVALSHA
该指标代表在EVALSHA中执行SET命令的性能,其中SET命令的Key范围为0-10000000,Value大小为64字节。
载入Lua脚本:
redis-cli -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 SCRIPT LOAD "return redis.call('SET', KEYS[1], ARGV[1])"
测试命令时长20秒:
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "EVALSHA d8f2fad9f8e86a53d2a6ebd960b33c4972cacc37 1 {key uniform 10000000} {value 64}"