mysql 压力测试

mysql 版本:5.7
linux:centos7
压测工具:sysbench

安装sysbench

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
sysbench --version

在这里插入图片描述
进入mysql 创建测试数据库,测试用户并授权

CREATE DATABASE test_db;
CREATE USER 'test_user'@'127.0.0.1' IDENTIFIED BY 'test_user';
GRANT ALL ON test_db.* TO 'test_user'@'127.0.0.1';
flush privileges;

基于sysbench构造测试表和测试数据

sysbench --db-driver=mysql --time=30 --threads=50 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=5 --table_size=1000000 oltp_read_write --db-ps-mode=disable prepare

在这里插入图片描述
参数解释:
–db-driver=mysql:基于mysql的驱动去连接mysql数据库,如果是oracle,或者sqlserver,那自然就是其他的数据库的驱动了
–time=30:这个就是说连续访问30秒
–threads=50:这个就是说用50个线程模拟并发访问
–report-interval=1:这个就是说每隔1秒输出一下压测情况
–mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user:这个是说连接到哪台机器的哪个端口上的MySQL库,他的用户名和密码是什么
–mysql-db=test_db --tables=5 --table_size=500000:这个是说在test_db这个库里,构造5个测试表,每个测试表里构造50万条测试数据
oltp_read_write:这个就是说,执行oltp数据库的读写测试
–db-ps-mode=disable:这个是禁止ps模式
prepare:意思是参照这个命令的设置去构造出来我们需要的数据库里的数据,他会自动创建5个测试表,每个表里创建50万条测试数据。

压力测试

测试数据库的综合读写TPS

sysbench --db-driver=mysql --time=30 --threads=50 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=5 --table_size=500000 oltp_read_write --db-ps-mode=disable run

oltp_write_only:测试写入性能
oltp_read_write : 测试读写性能
oltp_read_only:测试只读性能
oltp_delete:测试删除性能
oltp_update_index: 测试更新索引字段性能
oltp_update_non_index: 测试更新非索引字段性能
oltp_insert: 测试插入性能

完成压测之后,可以执行下面的cleanup命令,清理数据

sysbench --db-driver=mysql --time=300 --threads=50 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=5 --table_size=500000 oltp_read_write --db-ps-mode=disable cleanup

压测结果

按照我们上面的命令,我们让他每隔1秒都会输出一次压测报告,例如17s时输出的报告如下:

[ 17s ] thds: 50 tps: 713.31 qps: 14112.15 (r/w/o: 9905.32/2782.21/1424.62) lat (ms,95%): 173.58 err/s: 0.00 reconn/s: 0.00

thds: 50,有50个线程在压测
tps: 713.31,每秒执行了713.31个事务
qps: 14112.15,每秒可以执行14112.15个请求

(r/w/o: 9905.32/2782.21/1424.62),意思是在每秒9905.32个请求中,有2782.21个请求是读请求,1424.62个请求是写请求,剩下的是其他的请求
lat (ms, 95%):173.58,意思是95%的请求的延迟都在173.58毫秒以下
err/s: 0.00 reconn/s: 0.00,这两个的意思是每秒有0个请求是失败的,发生了0次网络重连

另外在完成压测之后,最后会显示一个总的压测报告:

SQL statistics:
    queries performed:
        read:                            273602
        write:                           78172
        other:                           39086
        total:                           390860
    transactions:                        19543  (650.89 per sec.)
    queries:                             390860 (13017.74 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          30.0240s
    total number of events:              19543

Latency (ms):
         min:                                    3.80
         avg:                                   76.77
         max:                                  710.73
         95th percentile:                      262.64
         sum:                              1500310.20

Threads fairness:
    events (avg/stddev):           390.8600/10.25
    execution time (avg/stddev):   30.0062/0.01

read: 273602 的意思是在30s的压测期间执行了27万多次的读请求
write: 78172 的意思在压测期间执行了差不多8万次的写请求
other: 39086 的意思是在压测期间执行了差不多4万次的其他请求
total: 390860 的意思是一共执行了39万多次的请求
transactions: 19543 ( 650.89 per sec. ) 的意思是一共执行了差不多2万万个事务,每秒执行650.89多个事务
queries: 390860 (13017.74 per sec. ) 的意思是一共执行了39万多次的请求,每秒执行1万3千多请求
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
// 下面就是说,一共执行了30s的压测,执行了差不多两万的事务
General staticstics:
total time: 30.0240s
total number of events: 19543
Latency (ms):
min: 3.80 意思是请求中延迟最小的是3.80ms
avg: 76.77 意思是所有请求平均延迟是76.77ms
max: 710.73 意思是延迟最大的请求是710.73ms
95th percentile: 262.64 意思是95%的请求延迟都在262.64 ms以内

压测时的机器性能指标

除了上面的 mysql 相关指标之外,在压测的时候还需要关注机器的其他一些性能指标。

CPU负载

CPU负载是一个很重要的性能指标,因为假设你数据库压测到了每秒处理3000请求了,可能其他的性能指标都还正常,但是此时CPU负载特别高,那么也说明你的数据库不能继续往下压测更高的QPS了,否则CPU是吃不消的。
查看cpu负载

top

top指令展示出各种信息
首先会看到如下一行信息:
在这里插入图片描述
top - 13:32:37 up 1:30, 3 users, load average: 3.91, 1.02, 0.70

首先13:32:37指的是当前时间,up 1:30指的是机器已经运行了多长时间, 3 user就是说当前机器有3个用户在使用。

最重要的是load average: 3.91, 1.02, 0.70这行信息,他说的是CPU在1分钟、5分钟、15分钟内的负载情况。

关于负载情况的解释:
假设我们是一个4核的CPU,此时如果你的CPU负载是0.15,这就说明,4核CPU中连一个核都没用满,4核CPU基本都很空闲

如果你的CPU负载是1,那说明4核CPU中有一个核已经被使用的比较繁忙了,另外3个核还是比较空闲一些。

如果你的CPU负载是4,那说明4核CPU都被跑满了

如果你的CPU负载是6,那说明4核CPU被繁忙的使用还不够处理当前的任务,很多进程可能一直在等待CPU去执行自己的任务。

内存负载

这个就是看看在压测到一定情况下的时候,你的机器内存耗费了多少,如果说机器内存耗费过高了,说明也不能继续压测下去了

free

在这里插入图片描述

可以看到当前机器的内存使用情况,总内存大概有1863040=1.77GB,已经使用了838008=0.8GB左右的内存,还有96836=94MB的内存是空闲的,然后有大概928196=906MB左右的内存用作OS内核的缓冲区了。

对于内存而言,同样是要在压测的过程中紧密的观察,一般来说,如果内存的使用率在80%以内,基本都还能接受,在正常范围内,但是如果你的机器的内存使用率到了70%~80%了,就说明有点危险了,此时就不要继续增加压测的线程数量和QPS了,差不多就可以了。

磁盘IO

安装dstat

yum install dstat

使用

dstat -d
-dsk/total-
 read  writ
2080k   32M

在上面可以清晰看到,存储的IO吞吐量是每秒钟读取2080k的数据,每秒写入32M的数据,一般普通的机械硬盘都可以做到每秒钟上百MB的读写数据量。

dstat -r
--io/total-
 read  writ
4.04  83.8 

他的这个意思就是读IOPS和写IOPS分别是多少,也就是说随机磁盘读取每秒钟多少次,随机磁盘写入每秒钟执行多少次,大概就是这个意思,一般来说,随机磁盘读写每秒在两三百次都是可以承受的。

网络负载

这个主要是要看看你的机器带宽情况下,在压测到一定的QPS和TPS的时候,每秒钟机器的网卡会输入多少MB数据,会输出多少MB数据,因为有可能你的网络带宽最多每秒传输100MB的数据,那么可能你的QPS到1000的时候,网卡就打满了,已经每秒传输100MB的数据了,此时即使其他指标都还算正常,但是你也不能继续压测下去了

dstat -n
-net/totalrecv send
16k 17k

这个说的就是每秒钟网卡接收到流量有多少kb,每秒钟通过网卡发送出去的流量有多少kb,通常来说,如果你的机器使用的是千兆网卡,那么每秒钟网卡的总流量也就在100MB左右,甚至更低一些。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值