一、mysql数据库的压测

1.名词概念理解

QPS:

英文全称:Query Per Second,对数据库来说就是每秒可以处理多少个请求,可以大致理解为一次请求就是一条sql语句,也就是说这个数据库每秒可以处理多少个sql语句。对于java应用系统或者一些中间件来说,就是每秒可以处理多少个请求。

TPS:

英文全称:Transaction Per Second,就是指每秒可以处理的事务量,就是每秒有多少个事务执行完毕。

IO相关的压测性能指标

IOPS:

这个指的是机器的随机IO并发处理能力,比如机器可以达到200 IOPS,意思就是说每秒可以执行200个随机IO读写请求。这个指标对mysql数据Buffer Pool中缓存数据刷入磁盘文件时特别重要,如果IOPS值比较小是,缓存数据刷入磁盘就会比较慢,因为它刷入磁盘采用对就是随机读写。

吞吐量

这个指机器的磁盘存储每秒可以读写多少字节的数据量。这个指标也是特别关键的,因为mysql在执行sql提交事务的时候会写redo log之类的日志文件到磁盘中,所以一台机器每秒可以读写多少字节的数据量就决定了每秒可以把多少redo log之类的日志文件写入磁盘。一般来说redo log之类的日志文件写磁盘都是顺序写的也就是一行接着一行写,不会说进行随机的读写,那么一般普通磁盘的顺序写入吞吐量可以达到200MMB左右。所以,一般机器的磁盘吞吐量是可以承载高并发请求的。

latency

这个指往磁盘写入一条数据的延迟

其他的性能指标

CPU负载
网络负载

主要看机器的带宽大小是多少,在压测一定的QPS和TPS的时候,每秒钟机器的网卡会输入多少M的数据和输出多少M的数据。因为有可能你的带宽最多每秒传输100M的数据,那么可能你的QPS到1000的时候,你的带宽就打满了,即使其他的指标正常,那么这也不能继续压测了。

内存负载

2.使用压测工具对mysql进行全方位压测(sysbench)

sysbench工具的安装

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

如果执行完上面的命令之后,出现版本号,说明安装成功。

测试数据库的测试用例

首先创建一个数据库,然后取名字为test_db,同时创建号对应的帐户名和密码,然后基于sysbench构建10个测试表,每个表里有100万数据,接着使用10个并发线程对这个数据库发起访问,连续访问5分钟。

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

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql�
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_read_write --db-ps-mode=disable prepare

参数含义解释:
--db-driver=mysql:就是说基于mysql的驱动去连接mysql数据库,如果要是oracle、sqlserver,那就换成其他数据库的驱动。
--time=300:连续访问300秒
--threads=10:10个线程模拟并发访问
--report-interval=1:每隔1秒输出一下压测情况
--mysql-host=127.0.0.1 --mysql�
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword:
填写数据库的一些基本信息
--mysql-db=test_db --tables=10 --table_size=1000000:在test_db这个库里,构造10张测试表,每个测试表里构造100万条测试数据,测试表的名字会是类似于sbtest1,sbtest2这个样子的。
oltp_read_write:执行oltp数据库的读写测试
--db-ps-mode=disable: SQL是否需要预编译,模式有:auto/disable,默认为disable。
prepare: 这个参数的意思是参照设置的命令参数去构造出我们需要的数据库里的数据,比如根据上面的参数它会自动创建设置出10张测试表和每个表里面创建100万条测试数据。这个参数还有其他几个选项比如:run:运行压测;cleanup:清理数据。

测试数据库的综合读写TPS,使用的是oltp_read_write模式(看下面的命令把prepare换成run了,然后就是运行压测):

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql�
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_read_write --db-ps-mode=disable run

测试数据库的只读性能,使用oltp_read_only模式:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql�
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_read_only --db-ps-mode=disable run

测试数据库的删除性能,使用的是oltp_delete模式:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql�
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_delete --db-ps-mode=disable run

测试数据库更新索引字段的性能,使用的是oltp_update_index模式:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql�
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_update_index --db-ps-mode=disable run

测试数据库更新非索引字段的性能,使用的是oltp_update_non_index模式:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql�
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_update_non_index --db-ps-mode=disable run

测试数据库的插入性能,使用的是oltp_insert模式:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql�
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_insert --db-ps-mode=disable run

测试数据库的写入性能,使用的是oltp_write_only模式:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql�
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_write_only --db-ps-mode=disable run

清理压测构造的数据:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql�
port=3306 --mysql-user=mysqlusername --mysql-password=mysqlpassword --mysql-db=test_db --tables=10 --
table_size=1000000 oltp_read_write  --db-ps-mode=disable cleanup

压测结果分析

image.png

以红色框住的测试信息为例,解析说明其含义:
thds:10 ,10个线程在压测
tps:226.01 ,每秒可以执行226.01个事务
qps:4499.11 ,每秒可以执行4499.11个请求
(r/w/o: 3144.07/904.02/451.01) :,在每秒4499.11个请求中有3144.07个读请求,904.02个写请求,451.01个其他请求,其实就是对qps的拆解。
lat (ms,95%): 223.34 :,95%的请求延迟在223.34毫秒以下
err/s: 0.00 reconn/s: 0.00:,每秒有0个请求是失败的,发生了0次网络重连。

备注说明:其他请求是指类似commit等,除了select,insert,update,delete

最终的压测报告

image.png

通过dstat命令来查看机器的性能指标

安装dstat

yum -y install dstat

查看磁盘的吞吐量

dstat -d
image.png

上图可以清晰的看到,IO吞吐量每秒读取28B的数据,每秒写入41k的数据,一般机械硬盘都可以做到每秒上baiMB的读写数据量。
查看磁盘的IOPS

dstat -r

image.png

上面的参数意思是读IOPS和写IOPS分别是多少,就是说随机磁盘读取每秒读取多少次,和随机磁盘写入,每秒钟执行多少次,一般情况下,随机磁盘读写每秒在两三百次是可以接受的。
观察网卡的流量情况

dstat -n
image.png

上图显示的就是每秒钟通过网卡接收到的流量有多少kb,通过网卡发送出的流量有多少kb,如果你的机器是千兆网卡的话,那么每秒中网卡的总流量也就在100MB左右,甚至更低。

通过top命令来查看cpu,内存等性能指标

image.png

你可能感兴趣的:(一、mysql数据库的压测)