Redis性能测试
官方已经为我们准备好性能测试工具 redis-benchmark ,它可以测试我们redis各个类型及场景下的读写性能
1、基本属性说明
Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests>] [-k <boolean>] -h <hostname> 设置redis服务端 IP (default 127.0.0.1) -p <port> 设置redis服务端 端口 (default 6379) -a <password> 设置redis服务端 密码 -c <clients> 设置多少个redis客户端并发连接redis服务端 (default 50) -d <size> 设置每次SET/GET值的数据大小,默认3字节 “VXK” (default 3) -n <requests> 设置请求总数,若默认50个客户端,每个客户端只需要请求2000次 (default 100000) -q 只显示每种类型测试 读/写 的秒数(不会输出大片测试过程) -l 闭环模式,测试完后,循环上一次测试,(就是命令永远循环) -r <keyspacelen> 设置指定数量的键;对SET/GET/INCR使用随机键,对SADD使用随机值,ZADD的随机成员和分数。 注:-r会被应用到key和counter键,并且拼接12位后缀标识为多少个;如 "key:000000000008" 代表生成的第八个键 -P <numreq> 选项代表每个请求pipeline的数据量. Default 1 (no pipeline). -t <tests> 设置选择性的测试操作,它只会对我们指定的命令测试 如 -t SET,SPOP,LPUSH (低版本只能测试17个命令) 注:看下面的性能测试方式,选择其中指定方式测试 -I 空闲模式。只需打开N个空闲连接并等待 -s <socket> Server socket (覆盖主机和端口) -k <boolean> 1=保持活动状态 0=重新连接 (default 1) 注:默认测试是一旦第一次连接,后面就不会断开,直到测试完成, 注:若是 1 则代表每次请求完成则断开连接,下次请求再重新连接 --csv 以CSV格式输出,方便我们统计Excel等处理 --user <username> 用于发送ACL样式的“验证用户名密码”。需要 -a。 --dbnum <db> 选择指定的数据库号进行测试,redis默认数据库为(0~16) (default 0) --threads <num> 启动多线程模式来测试 --cluster 启用集群模式来测试 --enable-tracking 启动测试之前发送客户端跟踪 --help 帮助文档 --version 显示版本号
2:性能测试默认方式
如果未指定 -t xxx,xxx,... 则从头至尾20个性能测试方案依次进行 (1) PING_INLINE (2) PING_MBULK (3) SET:将字符串值value关联到key; (4) GET:返回key所关联的字符串值,如果key存储的值不是字符串类型,返回一个错误; (5) INCR:将key中存储的数字值增一。不能转换为数字则报错; (6) LPUSH:将一个或多个值value插入到列表key的表头; (7) RPUSH:将一个或多个值value插入到列表key的表尾; (8) LPOP:移除并返回列表key的头元素; (9) RPOP:移除并返回列表key的尾元素; (10) SADD:将一个或多个member元素加入到集合set当中,已经存在于集合的member元素将被忽略; (11) HSET:将字符串值value关联到hash里的key中 (12) SPOP:移除并返回集合中的一个随机元素; (13) ZADD:测试sortedSet有序集合的添加时间性能 (14) ZPOPMIN:测试sortedSet有序集合,删除多个值并把删除的值排序,从小到大 (15) LPUSH:将一个或多个value插入到列表key的表头; (16) LRANGE_100:返回列表key中指定区间内的元素,前100条元素; (17) LRANGE_300:返回列表key中指定区间内的元素,前300条元素; (18) LRANGE_500:返回列表key中指定区间内的元素,前500条元素; (19) LRANGE_600:返回列表key中指定区间内的元素,前600条元素; (20) MSET:同时设置一个或多个key-value对,value为字符串。 如果未指定 -r 则以下面的四个键来测试 redis-benchmark性能测试默认情况下只会以如下类型key来测试(低版本应该是三个) 1) "myhash" 此类型为“hash”,每次请求则会向“hash”key为 “element:__rand_int__” 添加“VXK”,后者覆盖前者 2) "counter:__rand_int__" 此类型为“string”,每次请求则会累加 1 ,后个请求会对前一个值+1操作 3) "key:__rand_int__" 此类型为“string”,每次请求则会存放“VXK”,后个请求覆盖上一个值 4) "mylist" 此类型为“list”,往集合内部存储“VXK”,每请求一次则插入一次
3:常用测试方案及说明
①:连接redis服务器并测试以50个客户端并发(平分每个客户端2000次)访问100000次 ./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 ②:不输出测试过程,只显示当前测试案例结束的时间 ./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -q ④:总和上面,并设置每个请求的请求值的大小字节 ./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -q -d 5 ④:综合上面,并设置指定的测试案例 ./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -q -d 5 -t SET,SADD,ZADD,GET# 随机 set/get 100万条命令,1000 个并发
./redis-benchmark -a 123456 -h 192.168.61.129 -p 6379 -t set,get -r 1000000 -n 1000000 -c 1000
测试输出的格式说明:(以 SET 测试案例说明) ./redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -n 1000000 -t SET ====== SET ====== 1000000 requests completed in 18.75 seconds -- 1000000 请求用时 18.75 秒 1000 parallel clients -- 每个客户端请求次数1000 3 bytes payload -- 每次测试请求字节大小为 3byte keep alive: 1 -- 保持活力模式 1 一直连接 (0则代表每次请求从新连接) host configuration "save": 3600 1 300 100 60 10000 host configuration "appendonly": no -- 上面两个主机配置 持久化方式关闭 multi-thread: no -- 不是多线程测试 Latency by percentile distribution: 0.000% <= 6.159 milliseconds (cumulative count 1) 50.000% <= 13.191 milliseconds (cumulative count 500348) 75.000% <= 15.687 milliseconds (cumulative count 750168) 98.438% <= 26.799 milliseconds (cumulative count 984415) 100.000% <= 49.151 milliseconds (cumulative count 1000000) 100.000% <= 49.151 milliseconds (cumulative count 1000000) Cumulative distribution of latencies: 0.000% <= 0.103 milliseconds (cumulative count 0) 1.234% <= 7.103 milliseconds (cumulative count 12338) 12.473% <= 9.103 milliseconds (cumulative count 124733) 49.156% <= 13.103 milliseconds (cumulative count 491559) 100.000% <= 48.127 milliseconds (cumulative count 999999) 100.000% <= 50.111 milliseconds (cumulative count 1000000) Summary: throughput summary: 53339.02 requests per second -- 吞吐量摘要:每秒53339.02个请求 latency summary (msec): --延迟摘要(毫秒) avg min p50 p95 p99 max 13.639 6.152 13.191 21.663 28.351 49.151
4:其它参数介绍
①:-P <numreq> 在上面的性能测试中,每个客户端都是在一个请求完成之后才发送下一个请求,如指定-c 50 -n 10000 则服务器几乎是按照顺序依次读取每个客户端的请求 Redis 支持 /topics/pipelining;就是说Redis可以一次性执行多条命令(把命令打包一次性发送服务器) 所以Redis pipelining 可以提高服务器的 TPS。 总结:减少网络的请求,把请求汇总处理 ./redis-benchmark -c 20 -n 1000000 -t set,get -P 16 -q