民工哥死磕Redis教程(二十一 ):性能测试及相关工具使用

2023-06-0717:24:32数据库教程Comments1,107 views字数 6109阅读模式

为什么需要性能测试?

性能测试可以让我们了解 Redis 服务器的性能优劣。在实际的业务场景中,性能测试是必不可少的。在业务系统上线之前,我们都需要清楚地了解 Redis 服务器的性能,从而避免发生某些意外情况,比如数据量过大会导致服务器宕机等。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

本文将介绍几种不同的方式对Redis的性能进行相关的测试,大家可以根据自己的实际使用需求来选择不同的工具。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

redis-benchmark 介绍

为了解 Redis 在不同配置环境下的性能表现,Redis 提供了一种性能测试工具 redis-benchmark(也称压力测试工具),它通过同时执行多组命令实现对 Redis 的性能测试。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

语法格式

redis-benchmark [option] [option value]

option #可选参数。
option value #具体的参数值。

注意:该命令是在 redis 的目录下执行的,而不是 redis 客户端的内部指令。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

参数说明

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          #显示版本号

测试案例

①:连接redis服务器并测试以50个客户端并发(平分每个客户端2000次)访问100000次文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 

②:不输出测试过程,只显示当前测试案例结束的时间文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -q

④:综合上面,并设置每个请求的请求值的大小字节文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -q -d 5

④:综合上面,并设置指定的测试案例文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

./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 个并发文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

./redis-benchmark -a 123456 -h 192.168.61.129 -p 6379 -t set,get -r 1000000 -n 1000000 -c 1000

测试输出的格式说明:(以 SET 测试案例说明)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

./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

memtier_benchmark 的使用

memtier_benchmark是Redis Labs推出的一款命令行工具。它可以根据需求生成多种结构的数据对数据库进行压力测试,以了解目标数据库的性能极限。其部分功能特性如下。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

  • 支持Redis和Memcached数据库测试。
  • 支持多线程、多客户端测试。
  • 可设置测试中的读写比例(SET: GET Ratio)。
  • 可自定义测试中键的结构。
  • 支持设置随机过期时间。

使用教程如下

安装依赖

memtier_benchmark的安装依赖以下依赖包:Git、libevent 2.0.10或更高版本、libpcre 8.x、autoconf、automake、GNU make、GCC C++ compiler。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

yum install git
yum install autoconf automake make gcc-c++
yum install pcre-devel zlib-devel libmemcached-devel
 
# 如您系统中的libevent库不符合要求,下载并安装libevent-2.0.21
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar xfz libevent-2.0.21-stable.tar.gz
pushd libevent-2.0.21-stable
./configure
make
sudo make install
popd
 
# 设置PKG_CONFIG_PATH使configure能够发现前置步骤安装的库。
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH}
下载并编译memtier_benchmark
git clone https://github.com/RedisLabs/memtier_benchmark.git
cd memtier_benchmark
autoreconf -ivf
./configure
make
make install
测试方法

使用示例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

./memtier_benchmark -s r-XXXX.redis.rds.aliyuncs.com -p 6379 -a XXX -c 20 -d 32 --threads=10 
--ratio=1:1 --test-time=1800 --select-db=10

具体参数如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

-s #Redis数据库的连接地址
-a #Redis数据库的密码
-c #测试中模拟连接的客户端数量
-d #测试使用的对象数据的大小
--threads #测试中使用的线程数
--ratio #测试命令的读写比率(SET:GET Ratio)
--test-time #测试时长(单位:秒)
--select-db #测试使用的DB数量

python脚本对redis进行测试

除了使用redis-benchmark和memtier_benchmark,我们也可以使用python脚本对Redis进行性能测试。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

首先需要安装python版本的Redis:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

pip install redis

接着就可以编码连接Redis,并且进行测试:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

简单连接
import redis
 
# 创建Redis对象进行连接
# 参数:decode_responses是否解码返回值
r = redis.Redis(host = 'localhost', port = 6379, password = '123456', decode_responses = True)
 
# 终端下的命令在代码中都是函数
r.set('name', 'xiaoming')
 
print(r.get('name'))
连接池

多个redis对象使用同一个连接池进行连接,避免了多次连接、断开等操作的系统开销文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

import redis
 
# 创建连接池,减少了多次的连接、断开的开销
pool = redis.ConnectionPool(password = '123456', decode_responses = True)
 
# 创建Redis对象
r = redis.Redis(connection_pool = pool)
 
print(r.get('name'))

使用管道

管道可以记录多个操作,然后一次将操作发送至数据库,避免了多次向服务器发送少量的数据,多个操作可以依次进行保存,然后发送,也可以进行连贯操作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html

import redis
 
# 创建连接池,减少了多次的连接、断开的开销
pool = redis.ConnectionPool(password = '123456', decode_responses = True)
 
# 创建Redis对象
r = redis.Redis(connection_pool = pool)
 
# 创建管道
pipe = r.pipeline()
 
# 保存记录操作
#pipe.set('name', 'dahua')
#pipe.set('age', 20)
# 执行操作(发送到服务器),一次可以执行多个操作,可以避免多次的想服武器发送数据
#pipe.execute()
 
# 也可以进行连贯操作
pipe.set('name', 'haha').set('age', 10).execute()
 
print(r.get('name'))
参考文章:https://cnblogs.com/uestc2007/p/16962523.html https://blog.csdn.net/MOU_IT/article/details/121522395
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45706.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/45706.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定