Redis教程(十一)使用redis-benchmark对Redis进行性能测试

TangLu Redis 2019-10-15 2042 0

一、Redis性能测试场景

· 进行技术选型,比如Memcached和Redis性能对比

· 对比单机Redis和集群Redis的吞吐量

· 评估不同类型的数据类型存储性能,例如集合和有序集合

· 对比开启持久化和关闭持久化的吞吐量;

· 对比调优和未调优的吞吐量;

· 对比不同版本性能,作为是否升级的一个参考标准


二、Redis性能测试方法

· 编写代码模拟并发进行性能测试。需要开发介入,不够灵活,很难短时间内模拟大量并发数

· 使用 redis-benchmark 进行测试。官方提供的基准测试工具,使用简单,功能丰富


三、redis-benchmark常用选项

-h <hostname>:服务器地址,默认127.0.0.1
-p <port>:服务端口号,默认 6379
-s <socket>:服务器套接字,会覆盖主机名和端口号
-a <password>:Redis认证密码
-c <clients>:并发数,默认值为 50
-n <requests>:请求总数,默认100000
-d <size>:SET/GET 命令所操作的值的数据大小,以字节为单位,默认值为 2
–dbnum <db>:选择用于性能测试的数据库的编号(默认值为0)
-k <boolean>:1=保持连接;0=重新连接。默认为 1
-r <keyspacelen>:SET/GET/INCR 命令使用随机键,SADD 命令使用随机值。通过这个选项,基准测试会将参数中
的 __rand_int__ 字符串替换为一个 12 位的整数
-P <numreq>:使用管道机制处理 <numreq> 条 Redis 请求。默认值为 1代表不使用管道机制
-q:静默测试,只显示 QPS 的值。
–csv:将测试结果输出为 CSV 格式的文件。
-l:循环测试。基准测试会永远运行下去。
-t <tests>:基准测试只会运行列表中用逗号分隔的命令。测试命令的名称和结果输出产生的名称相同

-I:空闲模式,只会打开 N 个空闲的连接,然后等待


四、redis-benchmark示例

· 不带参数的测试,可以发现benchmark会使用常用的Set、Get、Incr等命令进行测试,基本能达到每秒 8W 的处理级别

redis-benchmark  #截取部分命令结果
====== PING_INLINE ======
100000 requests completed in 1.26 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.81% <= 1 milliseconds
100.00% <= 2 milliseconds
79302.14 requests per second
====== PING_BULK ======
100000 requests completed in 1.29 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.83% <= 1 milliseconds
100.00% <= 1 milliseconds
77459.34 requests per second
====== SET ======
100000 requests completed in 1.26 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.80% <= 1 milliseconds
99.99% <= 2 milliseconds
100.00% <= 2 milliseconds
79239.30 requests per second
====== GET ======
100000 requests completed in 1.19 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.72% <= 1 milliseconds
99.95% <= 15 milliseconds
100.00% <= 16 milliseconds
100.00% <= 16 milliseconds
84104.29 requests per second
====== INCR ======
100000 requests completed in 1.17 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.86% <= 1 milliseconds
100.00% <= 1 milliseconds
85397.09 requests per second
====== LPUSH ======
100000 requests completed in 1.22 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.79% <= 1 milliseconds
100.00% <= 1 milliseconds
82169.27 requests per second


· 精简测试,-q使用静默测试,-t指定测试指令,-n设置每个指令测试 100w 次

redis-benchmark -t set,get,incr -n 1000000 -q  #精简测试

SET: 81726.05 requests per second
GET: 81466.40 requests per second
INCR: 82481.03 requests per second


· Pipeline管道测试,-P表示每次执行10个命令,可以看出性能几乎是普通命令的8倍
redis-benchmark -t set,get,incr -n 1000000 -q -P 10

SET: 628535.50 requests per second
GET: 654450.25 requests per second
INCR: 647249.19 requests per second

五、影响基准测试的几个因素

1、网络带宽和网络延迟可能是 Redis 操作最大的性能瓶颈,比如有10w q/s,平均每个请求负责传输 8 KB 的字符,那需要的带宽至少要达到7.6 Gbits/s。传统的千兆网卡性能不足就会导致队列延迟

2、CPU 的计算能力跟不上Redis的请求也会影响 Redis 的运行效率

3、普通操作和批量操作(Pipeline)对 Redis 的吞吐量也有很大的影

评论