Redis性能测试工具redis-benchmark使用
阅读原文时间:2021年04月20日阅读:1

redis-benchmark的使用总结

Redis简介:

Redis是一个高性能的key-value数据库,redis与其他key-value缓存产品相比:
○ Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
○ Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
○ Redis支持数据的备份,即master-slave模式的数据备份。
○ Redis的优势:性能极高(读的QPS达到11w,写的QPS达到8w)

测试需求:

测试对象围绕Redis数据缓存功能,验证是否通过数据加密服务的情况下访问Redis服务的性能,本次性能测试考虑测性能指标包括QPS和延时;Redis测试范围包括:Redis操作单一key、操作多key及pipeline操作;测试场景覆盖通过数据加密服务及不通过数据加密服务两种情况下访问Redis。

测试环境架构

测试工具Redis-benchmark

Redis-benchmark是目前进行redis性能测试的主流工具,并且redis-benchmark是redis自带的工具,安装redis之后不需要安装即可直接使用

1 redis-benchmark使用方法

Redis-benchmark的使用非常简单,使用方法如下,Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]  我们只需要了解redis-benchmark命令参数的作用即可执行性能测试


[root@XXX ~]# redis-benchmark -h
    Invalid option "-h" or option argument missing
    Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]
     -h <hostname>      Server hostname (default 127.0.0.1)
     -p <port>          Server port (default 6379)
     -s <socket>        Server socket (overrides host and port)
     -a <password>      Password for Redis Auth
     -c <clients>       Number of parallel connections (default 50)
     -n <requests>      Total number of requests (default 100000)
     -d <size>          Data size of SET/GET value in bytes (default 2)
     --dbnum <db>        SELECT the specified db number (default 0)
     -k <boolean>       1=keep alive 0=reconnect (default 1)
     -r <keyspacelen>   Use random keys for SET/GET/INCR, random values for SADD
      Using this option the benchmark will expand the string __rand_int__
      inside an argument with a 12 digits number in the specified range
      from 0 to keyspacelen-1. The substitution changes every time a command
      is executed. Default tests use this to hit random keys in the
      specified range.
     -P <numreq>        Pipeline <numreq> requests. Default 1 (no pipeline).
     -e                 If server replies with errors, show them on stdout.
                        (no more than 1 error per second is displayed)
     -q                 Quiet. Just show query/sec values
     --csv              Output in CSV format
     -l                 Loop. Run the tests forever
     -t <tests>         Only run the comma separated list of tests. The test
                        names are the same as the ones produced as output.
     -I                 Idle mode. Just open N idle connections and wait.

    Examples:

     Run the benchmark with the default configuration against 127.0.0.1:6379:
       $ redis-benchmark

     Use 20 parallel clients, for a total of 100k requests, against 192.168.1.1:
       $ redis-benchmark -h 192.168.1.1 -p 6379 -n 100000 -c 20

     Fill 127.0.0.1:6379 with about 1 million keys only using the SET test:
       $ redis-benchmark -t set -n 1000000 -r 100000000

     Benchmark 127.0.0.1:6379 for a few commands producing CSV output:
       $ redis-benchmark -t ping,set,get -n 100000 --csv

     Benchmark a specific command line:
       $ redis-benchmark -r 10000 -n 10000 eval 'return redis.call("ping")' 0

     Fill a list with 10000 random elements:
       $ redis-benchmark -r 10000 -n 10000 lpush mylist __rand_int__

     On user specified command lines __rand_int__ is replaced with a random integer
     with a range of values selected by the -r option.

参数的作用

作用分类

参数及作用

连接 Redis 服务相关参数

-h :Redis 服务主机地址,默认为 127.0.0.1 。

-p :Redis 服务端口,默认为 6379 。

-s :指定连接的 Redis 服务地址,用于覆盖 -h 和 -p 参数。一般情况下,我们并不会使用。

-a :Redis 认证密码。

–dbnum :选择 Redis 数据库编号。

k :是否保持连接。默认会持续保持连接。

请求相关参数

-c :并发的客户端数

-n :总共发起的操作(请求)数

-d :指定 SET/GET 操作的数据大小,单位:字节。

-r :SET/GET/INCR 使用随机 KEY ,SADD 使用随机值。通过设置-r参数,可以设置KEY的随机范围,比如-r 10生成的KEY范围为[0,9)

-P :默认情况下,Redis 客户端一次请求只发起一个命令。通过 -P 参数,可以设置使用 pipeline功能,一次发起指定个请求,从而提升 QPS 。

-l :循环,一直执行基准测试。

-t :指定需要测试的 Redis 命令,多个命令通过逗号分隔。默认情况下,测试 PING_INLINE/PING_BULK/SET/GET 等等命令。若只想测试 SET/GET 命令,则可以 -t SET,GET 来指定。

-I :Idle 模式。仅仅打开 N 个 Redis Idle 个连接,然后等待,啥也不做。不是很理解这个参数的目的,目前猜测,仅仅用于占用 Redis 连接。

结果输出相关参数

-e :如果 Redis Server 返回错误,是否将错误打印出来。默认情况下不打印,通过该参数开启。

-q :精简输出结果。即只展示每个命令的 QPS 测试结果

-csv :按照 CSV 的格式,输出结果

2 测试查看

测试脚本自动化

测试步骤:

1、测试Redis 单一key,设置-r参数为1
测试命令:redis-benchmark -h redis-XXX.com -r 1 -c 100 –n 150000 -t get,set
2、测试Redis 多key,设置-r参数为50
测试命令:redis-benchmark -h redis-XXX.com -r 50 -c 100 –n 150000 -t get,set
3、测试Redis pipeline,设置-P参数为当前系统核数
测试命令:redis-benchmark -h redis-XXX.com -r 50 -c 100 –n 150000 -t get,set -P 16
4、手动调试确定连接数和发起请求书的最优区间范围,通过多次增加连接数和请求数的数值,从结果中选择较优结果情况下的连接数和请求数(比如 连接数300,请求数10w)
5、基于以上获取的请求数,设置-n参数为15w,在连接数相近的区间内(200–500),编写获取最优连接数的测试脚本,如下:

#!/bin/bash

connect=(200 250 300 350 400)
n=2000000
host1=redis-XXX.com
host2=192.168.0.138

for c in ${connect[@]}:
do
    ## redis-onekey
    echo "redis-benchmark -h $host1 -r 1 -c $c -n $n  -t get,set" >> ./results/redis-onekey.log
    redis-benchmark -h $host1 -r 1 -c $c -n $n  -t get,set >> ./results/redis-onekey.log
    ## redis-keys
    echo "redis-benchmark -h $host1 -r 100 -c $c -n $n -t get,set" >>./results/redis-keys.log
    redis-benchmark -h $host1 -r 100 -c $c -n $n -t get,set >>./results/redis-keys.log
    ## redis-pipeline
    echo "redis-benchmark -h $host1 -r 1 -c $c -n $n -t get,set -P 16" >>./results/redis-pipeline.log
    redis-benchmark -h $host1 -r 1 -c $c -n $n -t get,set -P 16 >>./results/redis-pipeline.log
    ## dsg-onekey
    echo "redis-benchmark -h $host2 -r 1 -c $c -n $n -t get,set" >>./results/dsg-onekey.log
    redis-benchmark -h $host2 -r 1 -c $c -n $n -t get,set >>./results/dsg-onekey.log
    ##dsg-keys
    echo "#dsg-keys /n redis-benchmark -h $host2 -r 100 -c $c -n $n -t get,set ">>./results/dsg-keys.log
    redis-benchmark -h $host2 -r 100 -c $c -n $n -t get,set >>./results/dsg-keys.log
    ## dsg-pipeline
    echo "redis-benchmark -h $host2 -r 1 -c $c -n $n -t get,set -P 16" >>./results/dsg-pipeline.log
    redis-benchmark -h $host2 -r 1 -c $c -n $n -t get,set -P 16 -q >>./results/dsg-pipeline.log
done

6、执行脚本之后,通过log日志,记录不同连接数下的QPS和lantency的结果,如下所示:

并发数设置

SET结果数据

GET结果数据

QPS/Lantency

QPS/Lantency

200

71123 / 13ms

72358 /11ms

250

81900 / 20ms

83194 / 20ms

300

89847 / 24ms

90497 / 20ms

350

93457 / 30ms

93370 / 29ms

400

95602 / 145ms

97847 /135ms

测试结果

使用pipeline可以大幅度提高redis服务器的处理能力,其基本原理是通过pipeline减少了网络传输的次数,因此降低了网络延迟的影响.